C++ 在C+;中查找最多两个浮点数的最快方法是什么+;?
找到最多两个浮点数的最快方法是什么: (a) (b) (c)C++ 在C+;中查找最多两个浮点数的最快方法是什么+;?,c++,C++,找到最多两个浮点数的最快方法是什么: (a) (b) (c) 谢谢至少在理论上,B和C会编译相同的代码。我之所以选择它们,是因为除非std::max不是函数调用(例如宏),否则它们将是最快的 Edit显然,std::max是一个模板函数调用,与表单C类似。 这里有一个不同的问题 为什么您认为这样一个小的优化在您的程序的更大范围内很重要 我发现像这样的微优化不太可能对您的程序产生明显的影响。除非剖析器明确指出这是一个问题,否则您永远不应该像这样进行微优化 编辑在评论中添加一些澄清 这个问题没有很好
谢谢至少在理论上,B和C会编译相同的代码。我之所以选择它们,是因为除非
std::max
不是函数调用(例如宏),否则它们将是最快的
Edit显然,std::max
是一个模板函数调用,与表单C类似。
这里有一个不同的问题 为什么您认为这样一个小的优化在您的程序的更大范围内很重要 我发现像这样的微优化不太可能对您的程序产生明显的影响。除非剖析器明确指出这是一个问题,否则您永远不应该像这样进行微优化 编辑在评论中添加一些澄清 这个问题没有很好的答案的原因是代码的性能高度依赖于
是的,在某些情况下,这种优化可能很重要。但是,只有在非常特殊的情况下,代码才是非常紧密的高度调用循环的一部分。但是,识别此类代码的唯一方法是使用探查器 这是特定于编译器的,但我怀疑结果是相同的。查看一下编译器的汇编输出。在谈到“最快”时,观察结果与往常一样。您是否测量了最大计算的执行时间,并报告给流程的其余执行时间?这个“优化”决策是否会对应用程序的执行时间产生重大影响
我99%确信你的提案之间的差异不值得考虑。你可以自己在系统上检查 我在gcc-redhat上为你做的。在我的系统上,x1=439943.5和x2=434232.9的100000次执行的结果 a) 约1200 uSec b) 约600美圆 c) 约600美圆 编辑: 通过-O2优化,我在所有3种情况下都得到了相同的结果:~110 uSec
当然,实际结果取决于具体问题和系统中的许多因素。真正了解的唯一方法是测量它们。它们可能因编译器或平台而异
对每个循环运行100000或500000次迭代,并比较总执行时间。对它们进行基准测试并找出答案。通常将b或c定义为宏,并在整个代码中使用。请注意,这仅在大多数情况下有效,如果传入由非幂等运算符修改的x或y参数或带有副作用的函数调用,则此选项将失效。例如:
#define MAX(x,y) (((x) < (y)) ? (y) : (x))
...
MAX(i++, ++j); //won't work properly, the ++'s will get executed twice.
MAX(changeKSomehow(k), changeLSomehow(L)); //won't work, the functions will get called twice.
定义最大值(x,y)((x)<(y))?(y):(x))
...
最大值(i++,j++)//如果无法正常工作,++将执行两次。
最大值(变化幅度(k)、变化幅度(L))//如果不起作用,函数将被调用两次。
结果表明,std::max(至少对于GNU libstdc++)的实现方式几乎相同,并且使用
inline
提示。编译器应该能够在适当的时候接受提示(当y = x1;
if (y < x2)
y = x2;
y=x1;
if(y
编译器可以更好地解释删除else条件
Edit1:如果基准测试不要忘记用x1大于x2的一半进行测试,用x2大于的另一半进行测试。
否则,结果将无法反映实际情况
编辑2:如果你在内存为1或2k的嵌入式系统中工作,微优化在某种程度上是有用的。同时,思考为什么每种情况下的计时都不同也是一个有趣的问题。-O3双核Macbook pro 2.4ghz 标准::最大(x1,x2)时间:4.19488 Rmax :4.19613如果时间:4.18775?时间: 4.18831 标准::最大(x1,x2)时间:4.1836 Rmax :4.18274如果时间:4.18603?时间: 4.18857 标准::最大(x1,x2)时间:4.18714 Rmax :4.18759如果时间:4.19752?时间: 4.19797 标准::最大(x1,x2)时间:4.1926 Rmax :4.19293如果时间:4.19334?时间: 4.19626 标准::最大(x1,x2)时间:4.18963 Rmax's :4.19628如果时间:4.19253?时间: 4.19107
#包括
使用名称空间std;
int main(int argc,char*const argv[]{
uint64_t迭代次数=1000000000;
浮动x1=3455.232;
浮点数x2=7456.856;
浮动y=0;
用于(整数计数=0;计数<5;++计数)
{
时钟开始时间=时钟();
对于(uint64_t ii=0;ii std::cout首先,正如其他人所说,分析您的代码,并绝对确保这是值得优化的。如果是,请继续阅读:您可以不进行分支。有关更多详细信息,请参阅。英特尔x86具有(FCOMI/FCOMIP/FUCOMI/FUCOMIP)可提供浮点值的快速比较。您的CPU可能会
y = x1 > x2 ? x1 : x2;
#define MAX(x,y) (((x) < (y)) ? (y) : (x))
...
MAX(i++, ++j); //won't work properly, the ++'s will get executed twice.
MAX(changeKSomehow(k), changeLSomehow(L)); //won't work, the functions will get called twice.
y = x1;
if (y < x2)
y = x2;
#include <iostream>
using namespace std;
int main (int argc, char * const argv[]) {
uint64_t iterations = 10000000000;
float x1 = 3455.232;
float x2 = 7456.856;
float y = 0;
for (int count = 0; count < 5; ++count)
{
clock_t begin_time = clock();
for (uint64_t ii = 0; ii < iterations; ++ii)
{
y = std::max(x1, x2);
}
std::cout << "std::max(x1, x2) Time: " << float( clock () - begin_time ) / CLOCKS_PER_SEC << endl;
begin_time = clock();
for (uint64_t ii = 0; ii < iterations; ++ii)
{
y = x1;
if (y < x2)
y = x2;
}
std::cout << "RMAAx's : " << float( clock () - begin_time ) / CLOCKS_PER_SEC << endl;
begin_time = clock();
for (uint64_t ii = 0; ii < iterations; ++ii)
{
if (x1 > x2)
y = x1;
else
y = x2;
}
std::cout << "if Time: " << float( clock () - begin_time ) / CLOCKS_PER_SEC << endl;
begin_time = clock();
for (uint64_t ii = 0; ii < iterations; ++ii)
{
y = x1 > x2 ? x1 : x2;
}
std::cout << "? Time: " << float( clock () - begin_time ) / CLOCKS_PER_SEC << endl;
}
return 0;
}