Rust: рдереНрд░реЗрдбрдЖрд░рдПрдирдЬреА рдкреНрд░рджрд░реНрд╢рди рдмрдЧ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 8 рдЬреБрд▓ре░ 2017  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: rust-lang/rust

ThreadRng Java рдореЗрдВ ThreadLocalRandom рдХреА рддреБрд▓рдирд╛ рдореЗрдВ 5 рдЧреБрдирд╛ рдзреАрдореА рдЧрддрд┐ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдореИрдВ рдЗрд╕ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХреЛ рд░рд╕реНрдЯ рдореЗрдВ рдЪрд▓рд╛рддрд╛ рд╣реВрдВ:

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

рдореЗрд░реЗ рд▓реИрдкрдЯреЙрдк рдкрд░ рдкрд░рд┐рдгрд╛рдо рд╣реИ:
рдкрд░реАрдХреНрд╖рдг рдкрд░реАрдХреНрд╖рдг::рдмреЗрдВрдЪ_рд░рдВрдб ... рдмреЗрдВрдЪ: 49 рдПрдирдПрд╕/рдЗрдЯрд░ (+/- 1)

рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдореИрдВ рдЬреЗрдПрдЪрдПрдо рдкрд░ рдПрдХ рд╣реА рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдЪрд▓рд╛рддрд╛ рд╣реВрдВ:

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

рдореЗрд░реЗ рд▓реИрдкрдЯреЙрдк рдкрд░ рдкрд░рд┐рдгрд╛рдо рд╣реИ:
рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдореЛрдб Cnt рд╕реНрдХреЛрд░ рддреНрд░реБрдЯрд┐ рдЗрдХрд╛рдЗрдпрд╛рдБ
Main.testRnd рдФрд╕рдд 20 9,018 ┬▒ 0,094 ns/op

рддреЛ рдкреНрд░рджрд░реНрд╢рди рдмрдЧ рдХреА рддрд░рд╣ рджрд┐рдЦрдиреЗ рд╡рд╛рд▓рд╛ рдЕрдВрддрд░ 5.44 рдЧреБрдирд╛ рд╣реИред

рдореЗрдЯрд╛

рдЬрдВрдЧ:

рд░рдмреЛрд╕
рд░рд╕реНрдЯрд╕реА 1.20.0-рд░рд╛рдд рдореЗрдВ (c9bb93576 2017-06-24)
рдмрд╛рдЗрдирд░реА: рд░рд╕реНрдЯрд╕реА
рдкреНрд░рддрд┐рдмрджреНрдз-рд╣реИрд╢: c9bb93576d4484edd1b3c40eb2aea0dfa0788851
рдкреНрд░рддрд┐рдмрджреНрдз-рддрд╛рд░реАрдЦ: 2017-06-24
рд╣реЛрд╕реНрдЯ: x86_64-рдЕрдЬреНрдЮрд╛рдд-рд▓рд┐рдирдХреНрд╕-рдЧреНрдиреВ
рд░рд┐рд▓реАрдЬ: 1.20.0-рд░рд╛рдд рдореЗрдВ
рдПрд▓рдПрд▓рд╡реАрдПрдо рд╕рдВрд╕реНрдХрд░рдг: 4.0

рдЬрд╛рд╡рд╛:
рдУрдкрдирдЬреЗрдбреАрдХреЗ 1.8.131

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдЪреВрдВрдХрд┐ rand рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рднрдВрдбрд╛рд░ рдХреЗ рд╕рд╛рде рдПрдХ рдмрд╛рд╣рд░реА рдЯреЛрдХрд░рд╛ рд╣реИ, рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд╢рд╛рдпрдж рд╡рд╣рд╛рдВ рд╣реИ , рдЬрдм рддрдХ рдХрд┐ рдЖрдк рдХрд┐рд╕реА рддрд░рд╣ рдпрд╣ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реИрдВ рдХрд┐ рдпрд╣ рдЬрдВрдЧ рдХреА рдЧрд▓рддреА рд╣реИ, рдФрд░ rand рдХреА рдЧрд▓рддреА рдирд╣реАрдВ рд╣реИред

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЬреЛ рдкреНрд░рд╢реНрди рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреВрдЫрдирд╛ рдЪрд╛рд╣рд┐рдП, рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛рдПрдБ рдорд┐рд▓ рд░рд╣реА рд╣реИрдВ? rand::ThreadRng рдПрдХ рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлрд┐рдХ рд░реВрдк рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рдЖрд░рдПрдирдЬреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЖрд░рдПрдирдЬреА рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рджрд░реНрд╢рди рдиреБрдХрд╕рд╛рди рд╣реЛрдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдЬреЛ рдЙрддрдирд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП ... "рдереНрд░реЗрдбрд▓реЛрдХрд▓ рд░реИрдВрдбрдо рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлрд╝рд┐рдХ рд░реВрдк рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИрдВред" рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЖрдк рдЙрдЪрд┐рдд рддреБрд▓рдирд╛ рднреА рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рд▓рд┐рдЦрд┐рдд рд░реВрдк рдореЗрдВ рдЕрдкрдирд╛ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдЪрд▓рд╛рдирд╛ рдореЗрд░реЗ рд▓рд┐рдП 21ns/iter рд╣реИред

thread_rng() рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдХреИрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рдореЗрд░реЗ рд▓рд┐рдП рдЗрд╕реЗ 15 ns/iter рдЧрддрд┐ рджреЗрддрд╛ рд╣реИред

#[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 рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рднрдВрдбрд╛рд░ рдХреЗ рд╕рд╛рде рдПрдХ рдмрд╛рд╣рд░реА рдЯреЛрдХрд░рд╛ рд╣реИ, рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд╢рд╛рдпрдж рд╡рд╣рд╛рдВ рд╣реИ , рдЬрдм рддрдХ рдХрд┐ рдЖрдк рдХрд┐рд╕реА рддрд░рд╣ рдпрд╣ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реИрдВ рдХрд┐ рдпрд╣ рдЬрдВрдЧ рдХреА рдЧрд▓рддреА рд╣реИ, рдФрд░ rand рдХреА рдЧрд▓рддреА рдирд╣реАрдВ рд╣реИред

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЬреЛ рдкреНрд░рд╢реНрди рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреВрдЫрдирд╛ рдЪрд╛рд╣рд┐рдП, рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛рдПрдБ рдорд┐рд▓ рд░рд╣реА рд╣реИрдВ? rand::ThreadRng рдПрдХ рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлрд┐рдХ рд░реВрдк рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рдЖрд░рдПрдирдЬреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЖрд░рдПрдирдЬреА рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рджрд░реНрд╢рди рдиреБрдХрд╕рд╛рди рд╣реЛрдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдЬреЛ рдЙрддрдирд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП ... "рдереНрд░реЗрдбрд▓реЛрдХрд▓ рд░реИрдВрдбрдо рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлрд╝рд┐рдХ рд░реВрдк рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИрдВред" рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЖрдк рдЙрдЪрд┐рдд рддреБрд▓рдирд╛ рднреА рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рд▓рд┐рдЦрд┐рдд рд░реВрдк рдореЗрдВ рдЕрдкрдирд╛ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдЪрд▓рд╛рдирд╛ рдореЗрд░реЗ рд▓рд┐рдП 21ns/iter рд╣реИред

thread_rng() рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдХреИрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рдореЗрд░реЗ рд▓рд┐рдП рдЗрд╕реЗ 15 ns/iter рдЧрддрд┐ рджреЗрддрд╛ рд╣реИред

#[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 рдПрдХ рдЕрддреНрдпрдВрдд рд╕рд░рд▓ рд░реИрдЦрд┐рдХ рд╕рд░реНрд╡рд╛рдВрдЧрд╕рдо PRNG рд╣реИ , рдЬрдмрдХрд┐ рд░рд╕реНрдЯ рдХрд╛ rand рдХрд╛ thread_rng() ISAAC (рджрд╛рд╡рд╛ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛) рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлрд╝рд┐рдХ рд░реВрдк рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд PRNG рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ

рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЖрдкрдХрд╛ рдмрд╣реБрдд-рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рджред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

cuviper picture cuviper  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

wthrowe picture wthrowe  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

drewcrawford picture drewcrawford  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

zhendongsu picture zhendongsu  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

eddyb picture eddyb  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ