【发布时间】:2019-04-19 20:28:57
【问题描述】:
给定 2 个执行相同操作的表达式 ([-3.14, 3.14] -> [0, 6.28]):
a > 0? a : a + 6.28
或
fmod(a + 6.28, 6.28)
两者在性能上是否存在普遍差异?
编辑:
假设这样的表达式被多次调用(这样性能是相关的)并且输入a 每次都不同。 (使问题更直接地回答)。
【问题讨论】:
-
有一个非常简单的答案:测量。编写一个基准测试并尝试一下(确保优化器已打开)。这是知道一件事是否真的比另一件事快的唯一方法。
-
当然,但我想我正在寻找更多经验法则的答案。如果没有,那很好。但我想知道两者之间是否有普遍的好处。
-
godbolt.org 可以对此有所帮助。查看您的两个解决方案使用 gcc 生成的程序集:godbolt.org/z/vEx4F9
-
另外,另一种选择,
std::clamp用于 C++。 -
通常在处理角度时,人们更愿意从 [0, 2π] 映射到 [−π, π] 而不是相反,以受益于接近零的浮点精度增加.将较小的负值映射到较大的值会降低准确性。
标签: c++ c modulus branch-prediction