a)
y = std::max(x1, x2);
b)
if (x1 > x2)
y = x1;
else
y = x2;
c)
y = x1 > x2 ? x1 : x2;
谢谢
y = std::max(x1, x2);
b)
if (x1 > x2)
y = x1;
else
y = x2;
c)
y = x1 > x2 ? x1 : x2;
谢谢
这是一个不同的问题
你认为在整个程序的大环境中,这样一个微小的优化会有影响吗?
我觉得像这样的微小优化几乎不可能对程序产生可感知的影响。除非使用了性能分析器并明确指出了这是一个问题,否则不应该进行微优化。
编辑 添加一些评论中的澄清
代码性能非常依赖于以下因素:
即使所有这些信息都包括在内,我们的答案也只是猜测。回答这个问题的唯一方法是使用性能分析器并找出哪个更快。
然而,这几乎肯定不值得。微调程序中如此小的一部分几乎肯定不会为您的代码增加任何可感知的性能优势。通常,除非性能分析器明确告诉您出现了问题,否则最好不要像这样优化代码。否则,您会花费大量时间来优化没有可感知好处的东西。
是的,有些情况下这样的优化可能很重要。但这只会发生在非常特殊的情况下,其中代码是高度调用的紧密循环的一部分。然而,识别此类代码的唯一方法是使用性能分析器。
-O3双核Macbook Pro 2.4GHz
std::max(x1,x2)时间:4.19488 RMAAx的:4.19613 if时间:4.18775?时间:4.18831
std::max(x1,x2)时间:4.1836 RMAAx的:4.18274 if时间:4.18603?时间:4.18857
std::max(x1,x2)时间:4.18714 RMAAx's:4.18759 if时间:4.19752?时间:4.19797
std::max(x1,x2)时间:4.1926 RMAAx's:4.19293 if时间:4.19334?时间:4.19626
std::max(x1,x2)时间:4.18963 RMAAx's:4.19628 if时间:4.19253?时间:4.19107
#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;
}
这取决于不同的编译器,但我认为结果应该是相同的。请查看编译器生成的汇编代码。
英特尔x86处理器有指令(FCOMI/FCOMIP/FUCOMI/FUCOMIP),可以快速比较浮点数值。你的CPU也可能拥有这样的指令。关键是找出应该编写哪些C++代码,以最大化编译器使用这些指令的可能性,而不是执行某些更慢但更通用的操作。
乐观的建议是使用std::max(float, float),希望其他人忽略那些嘲讽“微基准测试”和“过早优化”的人,并进行必要的研究,为std::max(float, float)提供专门化,以使用你硬件的特殊指令。
y = x1;
if (y < x2)
y = x2;
删除else条件可能会被编译器更好地解释。
编辑1:如果进行基准测试,请不要忘记将一半的测试用例中x1设置为大于x2,另一半则相反。否则,结果将不能反映真实情况。
编辑2:微优化在只有1或2k内存的嵌入式系统中是有用的。同时,思考为什么每种情况下的计时不同也是一个有趣的问题。
std::max
不是一个函数调用(例如宏),否则它们将是最快的。
编辑 显然,std::max
是一个类似于你的C形式的模板函数调用。
http://www.cplusplus.com/reference/algorithm/max/
通常情况下,当涉及到“最快”时,我们会有同样的观察。您是否测量了最大计算的执行时间,并将其报告给进程的其余执行时间?这个“优化”决策对应用程序的执行时间是否有重大影响?
我99%确定,您的建议之间的差异不值得考虑。
唯一真正了解它们的方法是测量它们。它们可能因编译器或平台而异。
循环运行每个项目100,000或500,000次,并比较总执行时间。