C++ 以下方法获得绝对值的速度是多少?
任务:使用阈值(比如1e-8)检查x(双精度)是否非常接近零。这就引出了两个性能问题 我目前使用的方法: 1:当我不确定数据是否完全为正时的保存方法C++ 以下方法获得绝对值的速度是多少?,c++,c++11,C++,C++11,任务:使用阈值(比如1e-8)检查x(双精度)是否非常接近零。这就引出了两个性能问题 我目前使用的方法: 1:当我不确定数据是否完全为正时的保存方法 double threshold = 0.00000001; if ( abs(x) < threshold ); //remove x 双阈值=0.00000001; if(abs(x)
double threshold = 0.00000001;
if ( abs(x) < threshold );
//remove x
双阈值=0.00000001;
if(abs(x)<阈值);
//删除x
2:如果我很确定数据是完全正面的话
if ( x < threshold )
//remove x
if(x
这就引出了我的第一个问题,第二种方法比第一种方法快吗?我总是认为第二种方法更快
我一直在考虑的另一种替代方法是使用
if ( x < threshold && x > -threshold )
//remove x
if(x-threshold)
//删除x
这就引出了我的第二个问题,这个方法比方法1快还是慢?如果有疑问,请描述它:现在的编译器非常善于进行优化。如果要深入研究,请检查生成的程序集 从概念上讲,
abs(x)
具有函数调用的开销,该函数调用必须通过值返回一个浮点双精度。
与一元求反-threshold
相同。假定和&
的短循环降低了阈值的评估概率
因此,if(x
肯定不会比另外两个慢
本能地,我会选择abs而不是否定,因为最重要的是,它是表达你想做什么的最清晰的方式。此外,编译器可能能够更容易地优化它,因为它是一个标准函数。在IEEE754中,abs
只不过是设置符号位而已。如果有疑问,请对其进行分析:如今的编译器擅长进行优化。如果要深入研究,请检查生成的程序集
从概念上讲,abs(x)
具有函数调用的开销,该函数调用必须通过值返回一个浮点双精度。
与一元求反-threshold
相同。假定和&
的短循环降低了阈值的评估概率
因此,if(x
肯定不会比另外两个慢
本能地,我会选择abs而不是否定,因为最重要的是,它是表达你想做什么的最清晰的方式。此外,编译器可能能够更容易地优化它,因为它是一个标准函数。在IEEE754中,abs
只不过是设置符号位。abs的性能取决于实现和优化级别。我认为没有哪一个答案是正确的,哪一个更快。
实际上,我将始终坚持使用abs
。正如Bathsheba所指出的,它可以像一条指令一样快,并且可以清楚地知道代码在做什么。另外,我真的认为这种“优化”没有什么意义。它几乎对任何程序的性能都没有什么影响。如果您对这一级别的性能如此认真,您可能应该自己编写汇编代码。abs的性能取决于实现和优化级别。我认为没有哪一个答案是正确的,哪一个更快。
实际上,我将始终坚持使用abs
。正如Bathsheba所指出的,它可以像一条指令一样快,并且可以清楚地知道代码在做什么。另外,我真的认为这种“优化”没有什么意义。它几乎对任何程序的性能都没有什么影响。如果您对这一级别的性能如此认真,您可能应该自己编写汇编代码。为什么不对其进行度量?因为这会给我一个没有解释的答案。不幸的是,关于性能的推理往往不起作用。专家们可能会先猜测,然后再测量。深入了解编译器/优化器,猜测生成的汇编代码,然后了解缓存、预取、,在CPU内部重新排序操作和并行执行多条指令以做出准确预测远远超出人脑的能力。为什么不测量一下呢?因为这会给我一个没有解释的答案。不幸的是,关于性能的推理往往不起作用。专家们可能会先猜测,然后再测量。足够详细地理解编译器/优化器以猜测生成的汇编代码,然后理解缓存、预取、操作重新排序以及在CPU内并行执行多条指令以做出准确预测,这远远超出了人脑的能力。abs()
是非常常见的内联候选。abs()
是非常常见的内联候选。