给定两个做相同事情的表达式([-3.14, 3.14] -> [0, 6.28]
(:
a > 0? a : a + 6.28
或
fmod(a + 6.28, 6.28)
这两者在表现上有普遍的区别吗?
编辑:假设这样的表达式被调用多次(这样性能是相关的(,并且每次输入的a
都不同。(为了更直接地回答问题(。
// Tertiary
t = a > 0? a : a + 6.28
// vs fmod
m = fmod(a + 6.28, 6.28)
两者在性能上有普遍的区别吗?
当然,评测是最好的@NathanOlive,但作为一般指南,请考虑优化潜力。
编译器通常会在a
的整个类型范围内进行优化,而不是[3.14,3.14]。t
是一个简单的计算,很容易进行优化。
此外,根据FLT_EVAL_METHOD,在C中,m
计算被强制为double
,当然还有一个函数调用。更多的限制意味着更少的优化可能性。CCD_ 7可以使用最佳FP宽度。
推荐a > 0 ? a : a + 6.28
作为一般首选方法。
给定两个做相同事情的表达式
但它们在域[-3.14, 3.14]
上做而不是做同样的事情
所有double
中约有1/4在[0…1.0]范围内。m
使用a + 6.28
将损失至少3到所有位的精度。优势:t
。
范围不同:t
的范围是[0,6.28]m
的范围是[0],6.28(,而不是[0,6.2 8]
关于更高目标的考虑
很明显,代码正在尝试三角范围缩小。要做好这件事比基本正弦更难。余弦,正切计算本身。关于庞大的争论,请参见争论减少:非常好。
如果代码以度数而不是弧度开始,请首先考虑以度数减少范围的优点。
更大的图片
根据a
的派生方式或t
、m
的使用方式,甚至可以提出更好的性能想法。因此,如果性能真的是一个问题,那么就需要周围的代码,否则我们会错误地进行微观优化。