arc4random_buf是否有最佳批量?
我需要来自arc4random_buf是否有最佳批量?,c,macos,performance,random,arc4random,C,Macos,Performance,Random,Arc4random,我需要来自arc4random\u buf的数十亿个随机字节,我的策略是一次请求X个随机字节,并重复多次 我的问题是X应该有多大。由于arc4random_buf的nbytes参数可以任意大,因此我认为一定存在某种内部循环,每次执行其主体时都会生成一些熵。比如说,如果X是每次迭代生成的随机字节数的倍数,那么性能可以提高,因为我没有浪费任何熵 我使用的是macOS,不幸的是它是封闭源码的,所以我不能简单地阅读源代码。是否有任何可移植的方法来确定最佳的X?在典型的目标系统上进行一些基准测试可能是解决
arc4random\u buf
的数十亿个随机字节,我的策略是一次请求X个随机字节,并重复多次
我的问题是X应该有多大。由于arc4random_buf
的nbytes
参数可以任意大,因此我认为一定存在某种内部循环,每次执行其主体时都会生成一些熵。比如说,如果X是每次迭代生成的随机字节数的倍数,那么性能可以提高,因为我没有浪费任何熵
我使用的是macOS,不幸的是它是封闭源码的,所以我不能简单地阅读源代码。是否有任何可移植的方法来确定最佳的X?在典型的目标系统上进行一些基准测试可能是解决这一问题的最佳方法,但从几个实现来看,缓冲区大小似乎不太可能对
arc4random_buffer
的成本产生很大影响
最初的实现将arc4random_buffer
实现为围绕一个函数的简单循环,该函数生成一个字节。只要缓冲区足够大以避免过多的呼叫开销,就应该不会有什么区别
FreeBSD库实现似乎试图通过定期计算大约1K的随机字节来进行优化。然后arc4random_buffer
使用memcpy
将字节从内部缓冲区复制到用户缓冲区
对于FreeBSD实现,最佳缓冲区大小将是内部缓冲区中可用的数据量,因为这样可以最大限度地减少对memcpy
的调用次数。但是,没有办法知道这是多少,而且由于密钥更新算法的原因,每次调用的值都不一样
我的猜测是,您会发现缓冲区大小之间的差异非常小,大于(比如)16K,甚至可能更小。对于FreeBSD实现,如果缓冲区大小是8的倍数,则效率会稍微提高一些
附录:我所知道的所有实现都有一个全局密钥重置阈值,因此您不能通过更改
arc4random\u buffer
中的缓冲区大小来影响密钥重置的成本。库只需对生成的每个X字节重新设置密钥。在典型的目标系统上进行一些基准测试可能是解决这一问题的最佳方法,但从几个实现来看,缓冲区大小似乎不太可能对arc4random_buffer
的成本产生很大影响
最初的实现将arc4random_buffer
实现为围绕一个函数的简单循环,该函数生成一个字节。只要缓冲区足够大以避免过多的呼叫开销,就应该不会有什么区别
FreeBSD库实现似乎试图通过定期计算大约1K的随机字节来进行优化。然后arc4random_buffer
使用memcpy
将字节从内部缓冲区复制到用户缓冲区
对于FreeBSD实现,最佳缓冲区大小将是内部缓冲区中可用的数据量,因为这样可以最大限度地减少对memcpy
的调用次数。但是,没有办法知道这是多少,而且由于密钥更新算法的原因,每次调用的值都不一样
我的猜测是,您会发现缓冲区大小之间的差异非常小,大于(比如)16K,甚至可能更小。对于FreeBSD实现,如果缓冲区大小是8的倍数,则效率会稍微提高一些
附录:我所知道的所有实现都有一个全局密钥重置阈值,因此您不能通过更改
arc4random\u buffer
中的缓冲区大小来影响密钥重置的成本。库只需对生成的每个X字节重新设置密钥。听起来基准测试是您最好的选择。@pjs有点离题,但我刚刚阅读了您的个人资料,认为您可能能够提供一些很好的见解?事实上,macOS的大部分都是开源的。arc4random\u buf()
实现是@pjs!起初,我希望得到一个快速的答案,比如“CSPRNGs适合蒙特卡罗模拟”,但阅读这些论文肯定会教我很多东西。也谢谢你的链接!听起来基准测试是你最好的选择。@pjs有点离题,但我刚刚阅读了你的个人资料,认为你可能能够提供一些很好的见解?事实上,macOS的大部分都是开源的。arc4random\u buf()
实现是@pjs!起初,我希望得到一个快速的答案,比如“CSPRNGs适合蒙特卡罗模拟”,但阅读这些论文肯定会教我很多东西。也谢谢你的链接!