ThreadRng bekerja 5 kali lebih lambat dari ThreadLocalRandom di Jawa.
Saya menjalankan benchmark ini di Rust:
#[bench]
fn bench_rnd(b: &mut Bencher) {
b.iter(|| rand::thread_rng().gen_range::<f64>(2.0, 100.0));
}
Di laptop saya hasilnya adalah:
tes tes::bench_rnd ... bangku: 49 ns/iter (+/- 1)
Tetapi jika saya menjalankan benchmark yang sama di JHM:
<strong i="12">@Benchmark</strong>
public double testRnd() {
return ThreadLocalRandom.current().nextDouble(2, 100);
}
Di laptop saya hasilnya adalah:
Unit Kesalahan Skor Cnt Mode Tolok Ukur
Main.testRnd rata-rata 20 9.018 ± 0,094 ns/op
Jadi perbedaannya adalah 5,44 kali terlihat seperti bug kinerja.
Karat:
rbose
rustc 1.20.0-malam (c9bb93576 2017-06-24)
biner: rustc
komit-hash: c9bb93576d4484edd1b3c40eb2aea0dfa0788851
tanggal-komit: 24-06-2017
host: x86_64-unknown-linux-gnu
rilis: 1.20.0-malam
Versi LLVM: 4.0
Jawa:
BukaJDK 1.8.131
Karena rand
adalah peti eksternal dengan repositorinya sendiri, masalah ini mungkin ada di sana , kecuali jika Anda entah bagaimana dapat menunjukkan bahwa ini adalah kesalahan Rust, dan bukan kesalahan rand
.
Namun, pertanyaan yang benar-benar harus Anda tanyakan, adalah angka acak seperti apa yang Anda dapatkan? rand::ThreadRng
adalah RNG yang aman secara kriptografis, jadi itu akan memiliki kelemahan kinerja yang melekat pada RNG yang tidak harus seaman itu. Melihat dokumentasi... "Instances dari ThreadLocalRandom tidak aman secara kriptografis." yang berarti Anda bahkan tidak melakukan perbandingan yang adil.
Menjalankan benchmark Anda seperti yang tertulis adalah 21ns/iter untuk saya.
Memodifikasi benchmark Anda ke cache hasil thread_rng()
mempercepat 15 ns/iter untuk saya.
#[bench]
fn bench_rnd(b: &mut Bencher) {
let mut rng = rand::thread_rng();
b.iter(|| rng.gen_range::<f64>(2.0, 100.0));
}
Namun, jika saya menggunakan weak_rng()
dan membuang keamanan kriptografi, ia akan melaju ke 3 ns/iter.
#[bench]
fn bench_rnd(b: &mut Bencher) {
let mut rng = rand::weak_rng();
b.iter(|| rng.gen_range::<f64>(2.0, 100.0));
}
Perhatikan juga bahwa ThreadLocalRandom
Java adalah PRNG kongruensial linier yang sangat sederhana, sedangkan rand
Rust's thread_rng()
didasarkan pada ISAAC (yang diklaim akan menjadi) PRNG yang
Terima kasih banyak atas penjelasannya.
Komentar yang paling membantu
Karena
rand
adalah peti eksternal dengan repositorinya sendiri, masalah ini mungkin ada di sana , kecuali jika Anda entah bagaimana dapat menunjukkan bahwa ini adalah kesalahan Rust, dan bukan kesalahanrand
.Namun, pertanyaan yang benar-benar harus Anda tanyakan, adalah angka acak seperti apa yang Anda dapatkan?
rand::ThreadRng
adalah RNG yang aman secara kriptografis, jadi itu akan memiliki kelemahan kinerja yang melekat pada RNG yang tidak harus seaman itu. Melihat dokumentasi... "Instances dari ThreadLocalRandom tidak aman secara kriptografis." yang berarti Anda bahkan tidak melakukan perbandingan yang adil.Menjalankan benchmark Anda seperti yang tertulis adalah 21ns/iter untuk saya.
Memodifikasi benchmark Anda ke cache hasil
thread_rng()
mempercepat 15 ns/iter untuk saya.Namun, jika saya menggunakan
weak_rng()
dan membuang keamanan kriptografi, ia akan melaju ke 3 ns/iter.