几年前作者写了关于随机浮点数的内容,当时主要关注代码的简洁性,未注意其性能。最近受Oliver Hunt 的评论和Alisa Sireneva 的博客文章启发,作者进行了小基准测试,可在pcg-dxsm.git
中找到。(2025 - 06 - 09 注意:发现结果有问题后对本文进行了大量编辑。)
- 回顾:将随机整数转换为 0.0 到 1.0 之间的浮点数有两种基本方法,一是通过位操作构建一个格式与 1.0 到 2.0 之间的浮点数匹配的整数,然后将其位转换为浮点数并减去 1.0;二是将整数下移到与尾数相同的范围,转换为浮点数,然后乘以一个缩放因子将其缩小到所需范围,这种方法比位操作转换多一位随机性。
代码:
- 基准测试:基准测试有 2×2×2 个测试,包括位操作与乘法、32 位与 64 位、顺序整数与随机整数。在 Apple M1 Pro 和 AMD Ryzen 7950X 上进行测试,由于函数小且在寄存器中工作,测量较困难,通过将函数编译在单独的翻译单元中并使用栅栏指令来防止编译器内联和优化。在 arm64 上,循环中的单个 ISB 足以获得合理测量;在 amd64 上,使用 MFENCE 但需通过指针传递参数和返回值。
- 结果:表格显示不同情况下的时间(纳秒/操作),左右列分别为随机位数和不同编译器的结果,最左边为无操作函数的开销,上半部分为顺序数,下半部分为随机数。arm64 上旧的乘法转换比位操作转换慢 3 或 4 个时钟周期,但新编译器可消除乘法后两者速度相同;amd64 上乘法转换比位操作转换慢 1 或 2 个时钟周期。
- 结论:民间说法是位操作浮点数比正常整数到浮点数转换快,作者的结果总体上与之相符,但在 arm64 上使用好的编译器时除外。比较其他 CPU 以更好地了解这种说法何时正确或错误会很有趣。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。