#syscalls #buffer #numbers #monte-carlo #system #calls #game-server

无std rng_buffer

围绕RNG进行包装,以缓冲其输出并保存系统调用

2个版本

0.1.1 2024年1月27日
0.1.0 2024年1月27日

#1641 in 算法

MIT授权

13KB
178

rng_buffer

这个小型crate提供了RngBufferCore,一个包装任何rand::Rng的结构体,并实现了BlockRngCore,这样在用作rand_core::block::BlockRng64时,每次调用将获取更多字节数。这主要用于在使用rand::rngs::OsRng或远程RNG客户端时减少系统调用次数,目的在于您希望定期重新播种以防止随机数中的微妙模式,但不需要快速密钥擦除(主要适用于蒙特卡洛模拟和游戏服务器;我不建议用于加密或赌博)。在运行Linux HVM内核版本6.1.72-96.166.amzn2023.x86_64的EC2 c7i.metal-24xl实例上使用Vtune进行性能分析显示,使用每个线程256字节缓冲区(目前是默认值)将系统调用中的CPU周期数减少了80%。

以下也提供

  • RngBufferWrapper,它是RngBufferCore的包装器,允许您与所有克隆共享缓冲区。当使用与缓冲区大小相同的切片调用fill_bytestry_fill_bytes时,它还将绕过缓冲区并直接调用包装的RNG。
  • RngWrapper,这是一个包装任何Rng的结构体,它将任何Rc<RefCell<_>>,以便克隆将使用相同的实例。对于实现rand::rngs::ThreadRng的自定义替换很有用。
  • thread_rng(),它是rand::thread_rng()的替代品,每个线程使用一个RngBufferCore,但其他行为相同。
  • thread_seed_source(),它为OsRng的线程局部实例提供了一个RngBufferWrapper
  • build_default_seeder()build_default_rng(),适用于无法使用线程局部变量的no_std环境。

依赖项

~0.8–1.5MB
~31K SLoC