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

3 c++

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

一个)

y = std::max(x1, x2);
Run Code Online (Sandbox Code Playgroud)

b)

if (x1 > x2)
    y = x1;
else
    y = x2;
Run Code Online (Sandbox Code Playgroud)

C)

y = x1 > x2 ? x1 : x2;
Run Code Online (Sandbox Code Playgroud)

谢谢

Jar*_*Par 25

这是一个不同的问题

为什么您认为如此小的优化在您的计划的更大范围内是重要的?

我发现这非常不可能的微型优化,如这会对你的程序的可感知的影响.除非探查器明确证明这是一个问题,否则你不应该像这样进行微优化.

编辑在评论中添加一些澄清

这个问题没有很好的答案的原因是该代码的性能高度依赖于......

  1. 它在您的程序中使用的方式
  2. 您正在使用的特定编译器
  3. 优化标志传递给您的编译器
  4. 您正在运行代码的特定体系结构
  5. 许多其他非常小的东西都没有包含在问题中

即使包含了所有这些信息,我们的答案也是最好的猜测.回答这个问题的唯一方法是扯出一个分析器并找出哪个更快.

然而,这几乎肯定不值得努力.微优化您的程序中的这么小部分几乎肯定不会为您的代码添加任何显着的性能优势.一般来说,优化这样的代码是一个非常糟糕的主意,除非探查器明确告诉你这是一个问题.否则你会花很多时间来优化一些东西而不会产生任何好处.

是的,有些情况下这种优化可能很重要.但这只是在一个非常特殊的情况下,代码是一个非常严格的高度调用循环的一部分.但是,识别此类代码的唯一方法是使用分析器.

  • 也许这是一个用户声音项目,但似乎在SO上有很多混乱,因为几乎每个优化问题的前N个答案都是这个变种.也许幽默的人只是回答他们的问题,或者自动将他们指向一个有这种建议的页面,然后问"你确定*你想问这个吗?",或类似的东西.为了记录,我认为你的建议很好而且不经常注意,但是如果有正当理由,或者提问者只是好奇,似乎几乎不可能得到有用的答案. (12认同)
  • 正如唐纳德克努特所说:"我们应该忘记效率低下,大约97%的时间说:过早的优化是所有邪恶的根源." (10认同)
  • 问题是直接的,答案应该是直接的.它是否是一个微不足道的优化并不重要.有些程序可以通过这种优化实现这种优化,并且这样的微优化可能对这些特定程序产生很大影响.每个人都应该记住一些事情:C++是关于absctraction和PERFORMANCE的,所以如果有办法更快地做事而不影响程序的完整性,那么就应该采取行动.在编译版本时,最终总结了一切.所以我认为这是一个有效的问题. (6认同)
  • @MattJ,我同意像我这样的很多答案让它成为顶级但他们这样做是有原因的.他们是对的.你不应该仅仅因为正确答案被说了太多次就说错了答案.这可能是OP第一次提出这个问题并且或者读过这种类型的答案.正如Eric在一两天前说的那样,没有办法回答这个问题.这种微优化的性能将与编译器,程序和OP正在使用的特定体系结构高度相关. (5认同)
  • @chila,我的答案是直接的,OP正在提出错误的问题.我不认为这个问题是无效的我认为它只是表明OP正在寻找错误的地方,正如我的答案所示.我不同意C++是关于性能的.C++是关于灵活性的,只支付您使用的费用.副作用是C++可以是一种性能极高的语言.如果这确实对最终程序产生影响,则分析器将显示该效果.这就是为什么你应该**总是**概述和基于你的优化,而不是像"哪种方式最快更快"的项目. (4认同)
  • 你提出了另一个问题然后你做了两个没有回答问题的陈述. (2认同)
  • 当然,如果这种比较每秒进行几百次,那么它甚至不值得为此烦恼.然而,我曾经在一个实时数字信号处理单元上工作,每个小的优化,如(可能)这个节省了十分之几.在优化阶段结束时,最大同时通道数比原始版本大约多40%.在这种情况下,您肯定希望通过最佳实现来捕获每个可能快2到10倍的细节.(并使用SIMD指令;-)) (2认同)
  • @chad,@ jem:问题是这个问题在一般意义上无法回答.如果问题是在优化级别A使用处理器X,OS Y,编译器Z时最快的方法,那么答案可能是有意义的.在所有其他情况下,答案没有意义,因为有太多正确答案,所有这些答案在不同情况下都是错误的. (2认同)
  • @Jared,OP的问题可以由编译器实现者为该编译器回答.知道EDG前端如何代表EDG中间语言中不同语法的人将能够100%确定是否存在任何差异,从而能够提供适用于许多编译器的答案.使用EDG作为前端. (2认同)

Igo*_*Oks 5

您可以在系统上自行查看.

我在gcc上为你做了 - redhat.在我的系统上的结果,对于100,000次执行,x1 = 432943.5,x2 = 434232.9

a)~1200 uSec b)~600 uSec c)~600 uSec

编辑:使用-O2优化我在所有3种情况下得到了相同的结果:~110 uSec.

当然,实际结果取决于您特定问题和系统中的许多因素.

  • 如何开启像-O2这样的优化并尝试它,这是一个更好的测试,因为它允许编译器内联. (2认同)