ThreadRng๋ Java์ ThreadLocalRandom๋ณด๋ค 5๋ฐฐ ๋๋ฆฌ๊ฒ ์๋ํฉ๋๋ค.
Rust์์ ์ด ๋ฒค์น๋งํฌ๋ฅผ ์คํํฉ๋๋ค.
#[bench]
fn bench_rnd(b: &mut Bencher) {
b.iter(|| rand::thread_rng().gen_range::<f64>(2.0, 100.0));
}
๋ด ๋ฉํฑ์์ ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
ํ
์คํธ ํ
์คํธ::bench_rnd ... ๋ฒค์น: 49ns/iter(+/- 1)
๊ทธ๋ฌ๋ JHM์์ ๋์ผํ ๋ฒค์น๋งํฌ๋ฅผ ์คํํ๋ ๊ฒฝ์ฐ:
<strong i="12">@Benchmark</strong>
public double testRnd() {
return ThreadLocalRandom.current().nextDouble(2, 100);
}
๋ด ๋ฉํฑ์์ ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๋ฒค์น๋งํฌ ๋ชจ๋ Cnt ์ ์ ์ค๋ฅ ๋จ์
Main.testRnd ํ๊ท 20 9,018 ยฑ 0,094ns/op
๋ฐ๋ผ์ ์ฐจ์ด๋ 5.44๋ฐฐ๊ฐ ์ฑ๋ฅ ๋ฒ๊ทธ์ฒ๋ผ ๋ณด์ ๋๋ค.
๋ น:
์๋ณด์ค
Rustc 1.20.0-nightly (c9bb93576 2017-06-24)
๋ฐ์ด๋๋ฆฌ: Rustc
์ปค๋ฐ ํด์: c9bb93576d4484edd1b3c40eb2aea0dfa0788851
์ปค๋ฐ ๋ ์ง: 2017-06-24
ํธ์คํธ: x86_64-unknown-linux-gnu
๋ฆด๋ฆฌ์ค: 1.20.0-nightly
LLVM ๋ฒ์ : 4.0
์๋ฐ:
์คํJDK 1.8.131
rand
๋ ์์ฒด ์ ์ฅ์๊ฐ ์๋ ์ธ๋ถ ํฌ๋ ์ดํธ์ด๋ฏ๋ก, ์ด๊ฒ์ด rand
์ ์๋ชป์ด ์๋๋ผ Rust์ ์๋ชป์ด๋ผ๋ ๊ฒ์ ์ด๋ป๊ฒ๋ ์
์ฆํ ์ ์๋ค๋ฉด ์ด ๋ฌธ์ ๋ ์๋ง๋ ๊ฑฐ๊ธฐ ์ ์ํ
๊ทธ๋ฌ๋ ์ ๋ง๋ก ๋ฌผ์ด์ผ ํ ์ง๋ฌธ์ ์ด๋ค ์ข
๋ฅ์ ๋์๋ฅผ ์ป๋ ๊ฒ์
๋๊น? rand::ThreadRng
๋ ์ํธํ๋ ๋ณด์ RNG์ด๋ฏ๋ก ๋ณด์์ด ํ์ํ์ง ์์ RNG์ ๊ณ ์ ํ ์ฑ๋ฅ ๋จ์ ์ด ์์ต๋๋ค. ๋ฌธ์๋ฅผ ๋ณด๋ฉด... "ThreadLocalRandom์ ์ธ์คํด์ค๋ ์ํธํ์ ์ผ๋ก ์์ ํ์ง ์์ต๋๋ค. " ์ด๋ ๊ณต์ ํ ๋น๊ต์กฐ์ฐจ ํ์ง ์๋๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
์์ฑ๋ ๋๋ก ๋ฒค์น๋งํฌ๋ฅผ ์คํํ๋ ๊ฒ์ 21ns/iter์ ๋๋ค.
thread_rng()
์ ๊ฒฐ๊ณผ๋ฅผ ์บ์ํ๋๋ก ๋ฒค์น๋งํฌ๋ฅผ ์์ ํ๋ฉด 15ns/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()
ํ๊ณ ์ํธํ ๋ณด์์ ๋ฒ๋ฆฌ๋ฉด 3ns/iter๋ก ์์๊ฐ๋๋ค.
#[bench]
fn bench_rnd(b: &mut Bencher) {
let mut rng = rand::weak_rng();
b.iter(|| rng.gen_range::<f64>(2.0, 100.0));
}
๋ํ Java์ ThreadLocalRandom
๋ ๋งค์ฐ ๋จ์ํ ์ ํ ํฉ๋ PRNG ์ธ ๋ฐ๋ฉด Rust์ rand
์ thread_rng()
๋ ISAAC(claimed-to-be) ์ํธํ์ ์ผ๋ก ์์ ํ PRNG ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก
๋ง์ ์ค๋ช ๊ฐ์ฌํฉ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
rand
๋ ์์ฒด ์ ์ฅ์๊ฐ ์๋ ์ธ๋ถ ํฌ๋ ์ดํธ์ด๋ฏ๋ก, ์ด๊ฒ์ดrand
์ ์๋ชป์ด ์๋๋ผ Rust์ ์๋ชป์ด๋ผ๋ ๊ฒ์ ์ด๋ป๊ฒ๋ ์ ์ฆํ ์ ์๋ค๋ฉด ์ด ๋ฌธ์ ๋ ์๋ง๋ ๊ฑฐ๊ธฐ ์ ์ํ๊ทธ๋ฌ๋ ์ ๋ง๋ก ๋ฌผ์ด์ผ ํ ์ง๋ฌธ์ ์ด๋ค ์ข ๋ฅ์ ๋์๋ฅผ ์ป๋ ๊ฒ์ ๋๊น?
rand::ThreadRng
๋ ์ํธํ๋ ๋ณด์ RNG์ด๋ฏ๋ก ๋ณด์์ด ํ์ํ์ง ์์ RNG์ ๊ณ ์ ํ ์ฑ๋ฅ ๋จ์ ์ด ์์ต๋๋ค. ๋ฌธ์๋ฅผ ๋ณด๋ฉด... "ThreadLocalRandom์ ์ธ์คํด์ค๋ ์ํธํ์ ์ผ๋ก ์์ ํ์ง ์์ต๋๋ค. " ์ด๋ ๊ณต์ ํ ๋น๊ต์กฐ์ฐจ ํ์ง ์๋๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.์์ฑ๋ ๋๋ก ๋ฒค์น๋งํฌ๋ฅผ ์คํํ๋ ๊ฒ์ 21ns/iter์ ๋๋ค.
thread_rng()
์ ๊ฒฐ๊ณผ๋ฅผ ์บ์ํ๋๋ก ๋ฒค์น๋งํฌ๋ฅผ ์์ ํ๋ฉด 15ns/iter ์๋๊ฐ ๋นจ๋ผ์ง๋๋ค.๊ทธ๋ฌ๋
weak_rng()
ํ๊ณ ์ํธํ ๋ณด์์ ๋ฒ๋ฆฌ๋ฉด 3ns/iter๋ก ์์๊ฐ๋๋ค.