Rust: Bug kinerja ThreadRng

Dibuat pada 8 Jul 2017  ·  3Komentar  ·  Sumber: rust-lang/rust

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.

meta

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

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 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));
}

Semua 3 komentar

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.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat