次正规浮点数字对性能的影响
在提供的代码片段中,一个看似微不足道的小改动却对性能产生了显着影响: 0.1f 到 0 导致速度减慢 10 倍。这种性能差异源于对次正规(非正规化)浮点数的处理。
次正规数是零的近似值,小于可以表示的最小正常浮点数。它们通常是由产生非常小的值的操作产生的。与标准化浮点数的操作相比,次正规数的操作非常慢。这是因为许多处理器缺乏直接处理次正规数的能力,而必须诉诸较慢的微代码例程。
数值检查
两个代码片段,一个使用 0.1 f 和另一个使用 0,在重复迭代后产生不同的输出。使用 0.1f 时,值收敛到接近于零的非零值。但是,当使用 0 时,这些值本身会收敛到零。这种数值行为的差异解释了性能差距。
非正态刷新
要验证次正规数是否造成性能差异,我们可以通过添加将它们刷新为零将以下行添加到代码开头:
_MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_ON);
这指示处理器将所有次正规数视为零。通过此修改,使用 0.1f 和 0 之间的性能差异可以忽略不计。这证实了次正规数确实是速度下降的根源。
结论
在这种情况下,通过用 0 替换 0.1f 来避免创建次正规数可以显着改善性能通过防止处理器参与缓慢的非正常数字处理例程来提高性能。这种优化提醒人们有时非规范化浮点数对性能产生不利影响,以及考虑它们在数值计算中潜在存在的重要性。
以上是为什么用 0 替换 0.1f 会使我的代码性能提高 10 倍?的详细内容。更多信息请关注PHP中文网其他相关文章!