生成随机数的最快方法

时间:2017-03-09 06:59:54

标签: random rust libc

libc有random

  

使用非线性附加反馈随机数生成器,使用大小为31的长整数的默认表来返回连续的伪随机数

我正在寻找一个用Rust编写的随机函数,速度相同。它不需要加密安全,伪随机就足够了。

通过rand crate查看XorShiftRng似乎最符合此需求:

  

Xorshift算法不适合加密目的,但速度非常快

当我像这样使用它时:

extern crate time;
use rand::Rng;

let mut rng = rand::XorShiftRng::new_unseeded();
rng.next_u64();

它比libc随机慢约33%。 (Sample code generating 8'000'000 random numbers)。

最后,我需要i64随机数,所以当我运行rng.gen()时,这已经比libc随机慢了100%。使用rng.next_u64() as i64进行投射时,速度会慢60%。

有没有办法在不使用任何unsafe代码的情况下达到相同的生锈速度?

1 个答案:

答案 0 :(得分:11)

请务必在发布模式下编译您正在测量的代码,否则您的基准测试不能代表Rust的性能。

为了获得有意义的数字,您还必须修改基准以对生成的数字执行某些操作,例如:将它们收集到载体 1 中。如果不这样做,可以使编译器优化整个循环,因为它没有副作用。这是您第二次尝试中发生的事情,导致您得出结论XorShiftRnglibc::random快760,000千倍。

changed benchmark在发布模式下运行时,XorShiftRng最终比libc::random快约2倍:

PT0.101378490S seconds for libc::random
PT0.050827393S seconds for XorShiftRng

1 编译器也可以足够聪明地意识到向量也是未使用的并且也将其优化掉,但是当前rustc不会这样做,并且将元素存储到向量中就足够了。确保生成不被优化的简单且面向未来的方法是总结数字并写出结果。