【发布时间】:2019-12-21 08:08:59
【问题描述】:
在我的 C++ 代码中,我必须根据给定条件在两个采用相同参数的函数之间进行选择。我可以写:
if (condition)
return foo(a, b, c);
else
return bar(a, b, c);
或者:
return (condition? foo : bar)(a, b, c);
但这两种方式哪一种更快?
编辑:
我尝试使用此代码进行测试:
#include <cmath>
#include <chrono>
#include <iostream>
using namespace std;
void foo(float x, float y, int param)
{
pow(x+y, param);
}
void bar(float x, float y, int param)
{
pow(x+y, param);
}
int main() {
const int loops = 1000;
auto t1 = chrono::high_resolution_clock::now();
for(int i = 0; i < loops; i++)
for(int j = 0; j < loops; j++)
(i==j? foo : bar)(i, j, 2);
auto t2 = chrono::high_resolution_clock::now();
for(int i = 0; i < loops; i++)
for(int j = 0; j < loops; j++)
if(i==j)
foo(i, j, 2);
else
bar(i, j, 2);
auto t3 = chrono::high_resolution_clock::now();
cout << "ternary: " << (chrono::duration_cast<chrono::microseconds>(t2-t1).count()) << "us" << endl;
cout << "if-else: " << (chrono::duration_cast<chrono::microseconds>(t3-t2).count()) << "us" << endl;
return 0;
}
使用更新后的测试代码:
ternary: 70951us
if-else: 67962us
【问题讨论】:
-
任何体面的编译器都会为两者输出相同的程序集。这是下一级的过早优化,你不应该关心的事情。选择最易读且适合您的项目风格的那个。
-
到目前为止你做过任何基准测试吗?为什么你会认为任何一种方法都应该优于另一种方法。您的问题不清楚。
-
time_t是基准测试时的钝器。它提供秒数。接下来,与写入控制台的成本相比,条件的成本微不足道。我认为您主要测量cout << blah。 -
@Hydren 首先,您应该在代码的定时部分中删除所有
couts。打印速度相对较慢,因此您可能只是在计算打印输出所需的时间。
标签: c++ performance if-statement function-pointers ternary-operator