C++ 在C+;中查找最多两个浮点数的最快方法是什么+;?

C++ 在C+;中查找最多两个浮点数的最快方法是什么+;?,c++,C++,找到最多两个浮点数的最快方法是什么: (a) (b) (c) 谢谢至少在理论上,B和C会编译相同的代码。我之所以选择它们,是因为除非std::max不是函数调用(例如宏),否则它们将是最快的 Edit显然,std::max是一个模板函数调用,与表单C类似。 这里有一个不同的问题 为什么您认为这样一个小的优化在您的程序的更大范围内很重要 我发现像这样的微优化不太可能对您的程序产生明显的影响。除非剖析器明确指出这是一个问题,否则您永远不应该像这样进行微优化 编辑在评论中添加一些澄清 这个问题没有很好

找到最多两个浮点数的最快方法是什么:

(a)

(b)

(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;iistd::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;
    }