以下方法获取绝对值的速度是多少



任务:使用阈值假设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指出的那样,它可以像一条指令一样快,并且可以清楚地了解您的代码正在做什么。另外,我真的认为这种"优化"没有什么意义。它对几乎任何程序的性能都有微不足道的影响。如果你对这个级别的性能非常认真,你可能应该自己编写汇编代码。

最新更新