生成随机数的最快方法

han*_*ast 3 random libc rust

libc有random哪些

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

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

仔细观察rand crate它似乎XorShiftRng最适合这种需求:

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

当我像这样使用它时:

extern crate time;
use rand::Rng;

let mut rng = rand::XorShiftRng::new_unseeded();
rng.next_u64();
Run Code Online (Sandbox Code Playgroud)

它比libc随机慢约33%.(产生8'000'000个随机数的样本代码).

最后,我需要i64随机数,所以当我运行时,rng.gen()它已经比libc随机慢100%.当铸造时rng.next_u64() as i64,则慢60%.

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

use*_*342 11

确保在发布模式下编译您正在测量的代码,否则您的基准测试不能代表Rust的性能.

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

随着更改的基准测试在发布模式下运行,XorShiftRng最终比libc::random以下快2倍:

PT0.101378490S seconds for libc::random
PT0.050827393S seconds for XorShiftRng
Run Code Online (Sandbox Code Playgroud)

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

  • @hansaplast Building for release告诉`rustc`(以及对底层LLVM后端的扩展)优化运行时效率。优化可以包括智能寄存器分配,函数内联,循环展开以及许多其他功能。C,BTW也是如此,只是* libc已经*已经*通过您的发行版进行了编译,包括优化。如果您尝试在未启用优化的情况下编译libc的“随机”,则可能还会看到糟糕的性能。 (2认同)