Ben Rust bu kriterleri çalıştırırsanız:Logaritma neden Java'da Java'dan daha yavaş?
#[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());
}
sonucudur: ln
çağrı başına
test tests::bench_ln ... bench: 121 ns/iter (+/- 2)
test tests::bench_rnd ... bench: 6 ns/iter (+/- 0)
121-6 = 115 ns.
Ama Java aynı kriter:
@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);
}
bana verir:
Benchmark Mode Cnt Score Error Units
Main.testLog avgt 20 31,555 ± 0,234 ns/op
günlük olduğunu ~ Java daha Rust (115/31) 3,7 kat daha yavaş.
Hipotenüs uygulamasının (hypot
) test edildiğinde, Rust uygulamasının Java'ya göre 15,8 katı daha hızlıdır.
Kötü kriterler yazdım ya da bir performans sorunu mu var? yorumlarda sorulan sorulara
Tepkiler:
"" Ülkemde bir ondalık ayırıcı olduğunu.
Rust'un benchmarkını her zaman yayın modunda çalışan
cargo bench
kullanarak çalıştırıyorum.Java kriter çerçevesi (JMH) bir
static
sınıf vefinal
değişken olmasına rağmen, her çağrı için yeni bir nesne oluşturur. Test edilen yönteme rastgele bir yaratım eklerseniz, 43 ns/op elde ederim.
Isnt java kriter temel olarak kullanmak ... Gerçekten ne zaman bilmiyorum ve nasıl olsa Rust olur? Yani java güzel ama bazı durumlarda çok güzel – Wietlol
Muhtemelen rasgele sayı üretecini log fonksiyonundan daha fazla kıyaslıyorsunuzdur. Ayrıca, pasın sadece sistem matematik kütüphanesini kullandığına inanıyorum, bu yüzden “log” için saf bir çağrı C'deki ile aynı olmalıdır (Java hakkında hiçbir fikir). –
Testi "RUSTFLAGS =" - Ctarget-cpu = native 'cargo bench 'kullanarak yeniden çalıştırabilirsiniz. – kennytm