为什么 Rust 中的对数比 Java 中的对数慢?
2022-09-02 04:05:43
如果我在 Rust 中运行这些基准测试:
#[bench]
fn bench_rnd(b: &mut Bencher) {
let mut rng = rand::weak_rng();
b.iter(|| rng.gen_range::<f64>(2.0, 100.0));
}
#[bench]
fn bench_ln(b: &mut Bencher) {
let mut rng = rand::weak_rng();
b.iter(|| rng.gen_range::<f64>(2.0, 100.0).ln());
}
结果是:
test tests::bench_ln ... bench: 121 ns/iter (+/- 2)
test tests::bench_rnd ... bench: 6 ns/iter (+/- 0)
121-6 = 每个呼叫 115 ns。ln
但是Java中的相同基准测试:
@State(Scope.Benchmark)
public static class Rnd {
final double x = ThreadLocalRandom.current().nextDouble(2, 100);
}
@Benchmark
public double testLog(Rnd rnd) {
return Math.log(rnd.x);
}
给我:
Benchmark Mode Cnt Score Error Units
Main.testLog avgt 20 31,555 ± 0,234 ns/op
Rust 中的日志比 Java 慢约 3.7 倍 (115/31)。
当我测试斜边实现()时,Rust中的实现比Java快15.8倍。hypot
我是否编写了糟糕的基准测试,或者这是一个性能问题?
对评论中提出的问题的回答:
“,”是我国的小数点分隔符。
我运行 Rust 的基准测试,它总是在发布模式下运行。
cargo bench
Java 基准测试框架 (JMH) 会为每次调用创建一个新对象,即使它是一个类和一个变量。如果我在测试的方法中添加随机创建,我得到43 ns / op。
static
final