任务:使用阈值假设1e-8检查x(双精度)是否非常接近零。这让我想到了两个性能问题。
我目前使用的方法:
1:当我不确定数据是否完全正确时保存的方法。
double threshold = 0.00000001;
if ( abs(x) < threshold );
//remove x
2:如果我非常确定数据是完全积极的。
if ( x < threshold )
//remove x
这就引出了我的第一个问题,第二种方法是否比第一种方法快?我只是一直认为第二种方法更快...
我一直在考虑作为方法 1 的替代方案的另一种方法是使用
if ( x < threshold && x > -threshold )
//remove x
这就引出了我的第二个问题,这种方法比方法1更快还是更慢?
如果有疑问,请对其进行分析:如今,编译器在进行优化方面很聪明。如果要更深入地研究,请检查生成的程序集。
但从概念上讲,abs(x)
具有函数调用的开销,该函数调用必须按值返回浮点数double.
一元否定-threshold
相同。当然,&&
的短循环降低了评估-threshold
的可能性。
因此,if ( x < threshold )
肯定不会比其他两个慢。
我本能地会abs
否定,因为最重要的是,这是表达你想做的事情的最清晰的方式。此外,编译器可能能够更容易地优化它,因为它是一个标准函数。在IEEE754中,abs
只不过是设置符号位。
abs
的性能取决于实现和优化级别。我不认为有一个正确的答案哪个更快。
实际上我会一直坚持abs
.正如Bathsheba指出的那样,它可以像一条指令一样快,并且可以清楚地了解您的代码正在做什么。另外,我真的认为这种"优化"没有什么意义。它对几乎任何程序的性能都有微不足道的影响。如果你对这个级别的性能非常认真,你可能应该自己编写汇编代码。