Rust: Ошибка ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ThreadRng

Π‘ΠΎΠ·Π΄Π°Π½Π½Ρ‹ΠΉ Π½Π° 8 июл. 2017  Β·  3ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ  Β·  Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: rust-lang/rust

ThreadRng Π² Java Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² 5 Ρ€Π°Π· ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅, Ρ‡Π΅ΠΌ ThreadLocalRandom.

Π― Π·Π°ΠΏΡƒΡΠΊΠ°ΡŽ этот тСст Π² Rust:

#[bench]
fn bench_rnd(b: &mut Bencher) {
    b.iter(|| rand::thread_rng().gen_range::<f64>(2.0, 100.0));
}

На ΠΌΠΎΠ΅ΠΌ Π½ΠΎΡƒΡ‚Π±ΡƒΠΊΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:
test tests :: bench_rnd ... bench: 49 нс / ΠΈΡ‚Π΅Ρ€ (+/- 1)

Но Ссли я ΠΏΡ€ΠΎΠ²Π΅Π΄Ρƒ Ρ‚ΠΎΡ‚ ΠΆΠ΅ тСст Π½Π° JHM:

<strong i="12">@Benchmark</strong>
public double testRnd() {
    return ThreadLocalRandom.current().nextDouble(2, 100);
}

На ΠΌΠΎΠ΅ΠΌ Π½ΠΎΡƒΡ‚Π±ΡƒΠΊΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:
Π•Π΄ΠΈΠ½ΠΈΡ†Ρ‹ измСрСния ошибки Π² ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅ Cnt Score
Main.testRnd avgt 20 9,018 ± 0,094 нс / оп

Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ Ρ€Π°Π·Π½ΠΈΡ†Π° Π² 5,44 Ρ€Π°Π·Π° выглядит ΠΊΠ°ΠΊ ошибка ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ.

ΠœΠ΅Ρ‚Π°

Π ΠΆΠ°Π²Ρ‡ΠΈΠ½Π°:

rbose
rustc 1.20.0-nightly (c9bb93576 24.06.2017)
Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΉ: rustc
ΠΊΠΎΠΌΠΌΠΈΡ‚-Ρ…Π΅Ρˆ: c9bb93576d4484edd1b3c40eb2aea0dfa0788851
Π”Π°Ρ‚Π° фиксации: 2017-06-24
хост: x86_64-unknown-linux-gnu
Ρ€Π΅Π»ΠΈΠ·: 1.20.0-Π½ΠΎΡ‡ΡŒ
ВСрсия LLVM: 4.0

Π”ΠΆΠ°Π²Π°:
OpenJDK 1.8.131

Π‘Π°ΠΌΡ‹ΠΉ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ rand - это внСшний ящик с собствСнным Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠ΅ΠΌ, эта ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, вСроятно, относится ΠΊ Π½Π΅ΠΌΡƒ , Ссли Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Ρ‹ Π½Π΅ смоТСтС ΠΊΠ°ΠΊΠΈΠΌ-Π»ΠΈΠ±ΠΎ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΏΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ это ошибка Rust, Π° Π½Π΅ ошибка rand .

Однако вопрос, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°Π΄Π°Ρ‚ΡŒ: ΠΊΠ°ΠΊΠΈΠ΅ случайныС числа Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅? rand::ThreadRng - это криптографичСски бСзопасный Π“Π‘Π§, поэтому ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ нСдостаток ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с Π“Π‘Π§, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΆΠ΅ бСзопасными. Глядя Π½Π° Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ ... «ЭкзСмпляры ThreadLocalRandom Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ криптографичСски бСзопасными», Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π΄Π°ΠΆΠ΅ Π½Π΅ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚Π΅ чСстноС сравнСниС.

Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ вашСго тСста, ΠΊΠ°ΠΊ написано, для мСня составляСт 21 нс / ΠΈΡ‚Π΅Ρ€.

ИзмСнСниС вашСго тСста для ΠΊΠ΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° thread_rng() для мСня ускоряСт Π΅Π³ΠΎ Π½Π° 15 нс / Π».

#[bench]
fn bench_rnd(b: &mut Bencher) {
    let mut rng = rand::thread_rng();
    b.iter(|| rng.gen_range::<f64>(2.0, 100.0));
}

Однако, Ссли я ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ weak_rng() ΠΈ ΠΎΡ‚ΠΊΠ°ΠΆΡƒΡΡŒ ΠΎΡ‚ криптографичСской Π·Π°Ρ‰ΠΈΡ‚Ρ‹, ΠΎΠ½Π° вырастСт Π΄ΠΎ 3 нс / Π».

#[bench]
fn bench_rnd(b: &mut Bencher) {
    let mut rng = rand::weak_rng();
    b.iter(|| rng.gen_range::<f64>(2.0, 100.0));
}

ВсС 3 ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ rand - это внСшний ящик с собствСнным Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠ΅ΠΌ, эта ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, вСроятно, относится ΠΊ Π½Π΅ΠΌΡƒ , Ссли Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Ρ‹ Π½Π΅ смоТСтС ΠΊΠ°ΠΊΠΈΠΌ-Π»ΠΈΠ±ΠΎ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΏΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ это ошибка Rust, Π° Π½Π΅ ошибка rand .

Однако вопрос, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°Π΄Π°Ρ‚ΡŒ: ΠΊΠ°ΠΊΠΈΠ΅ случайныС числа Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅? rand::ThreadRng - это криптографичСски бСзопасный Π“Π‘Π§, поэтому ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ нСдостаток ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с Π“Π‘Π§, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΆΠ΅ бСзопасными. Глядя Π½Π° Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ ... «ЭкзСмпляры ThreadLocalRandom Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ криптографичСски бСзопасными», Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π΄Π°ΠΆΠ΅ Π½Π΅ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚Π΅ чСстноС сравнСниС.

Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ вашСго тСста, ΠΊΠ°ΠΊ написано, для мСня составляСт 21 нс / ΠΈΡ‚Π΅Ρ€.

ИзмСнСниС вашСго тСста для ΠΊΠ΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° thread_rng() для мСня ускоряСт Π΅Π³ΠΎ Π½Π° 15 нс / Π».

#[bench]
fn bench_rnd(b: &mut Bencher) {
    let mut rng = rand::thread_rng();
    b.iter(|| rng.gen_range::<f64>(2.0, 100.0));
}

Однако, Ссли я ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ weak_rng() ΠΈ ΠΎΡ‚ΠΊΠ°ΠΆΡƒΡΡŒ ΠΎΡ‚ криптографичСской Π·Π°Ρ‰ΠΈΡ‚Ρ‹, ΠΎΠ½Π° вырастСт Π΄ΠΎ 3 нс / Π».

#[bench]
fn bench_rnd(b: &mut Bencher) {
    let mut rng = rand::weak_rng();
    b.iter(|| rng.gen_range::<f64>(2.0, 100.0));
}

Π’Π°ΠΊΠΆΠ΅ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ThreadLocalRandom Java - это Ρ‡Ρ€Π΅Π·Π²Ρ‹Ρ‡Π°ΠΉΠ½ΠΎ простой Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΉ конгруэнтный Π“ΠŸΠ‘Π§ , Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ rand thread_rng() Rust основан Π½Π° криптографичСски бСзопасном Π“ΠŸΠ‘Π§ ISAAC (заявлСнный ΠΊΠ°ΠΊ), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ стоит Π΄ΠΎΡ€ΠΎΠΆΠ΅, поэтому этот тСст Π½Π΅ совсСм ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для сравнСния яблок с яблоками.

Π‘ΠΎΠ»ΡŒΡˆΠΎΠ΅ спасибо Π·Π° объяснСниС.

Π‘Ρ‹Π»Π° Π»ΠΈ эта страница ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ?
0 / 5 - 0 Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³ΠΈ

Π‘ΠΌΠ΅ΠΆΠ½Ρ‹Π΅ вопросы

dnsl48 picture dnsl48  Β·  3ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

defuz picture defuz  Β·  3ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

overvenus picture overvenus  Β·  3ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

modsec picture modsec  Β·  3ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

cuviper picture cuviper  Β·  3ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ