【发布时间】:2019-03-16 13:53:02
【问题描述】:
我正在测试下面的代码来检查constexpr 的性能。对于第一次迭代,结果符合预期。但是对于下一次迭代,正常的函数调用有时会胜过constexpr。我在这里想念什么?我希望constexpr 电话在任何情况下都会更好。在第一次迭代后,正常函数所花费的时间也减少了。如何解释这种行为?
可以看到代码结果here
编辑:如果我取消注释以下代码中的行,为每次迭代提供不同的值来求和,结果仍然相似。你可以看到它的结果here
Edit2:我尝试了@geza 更改,并为第一个函数调用执行了 300 万次操作,并为第二个函数调用执行了
3 Million + i。我期望 constexpr 花费的时间非常少(几乎与 100 所花费的时间相同),但它花费的时间与 non-constexpr 函数一样多。结果link
#include <iostream>
#include <chrono>
using namespace std;
using namespace std::chrono;
constexpr long long sum(const int* n){
long long sum = 0;
for(int i = 1; i <= *n; i++){
sum += i;
}
return sum;
}
long long sum(int* n){
cout<<"Calling sum\n";
long long sum = 0;
for(int i = 1; i <= *n; i++){
sum += i;
}
return sum;
}
int main(void){
const int* p;
int a = 100;
p = &a;
int *p1;
p1 = &a;
for(int i = 0; i < 10; i++){
/*
int* p1;
int b = 100 + i; //If I uncomment the lines here are remove the
p1 = &b; //earlier p1 declaration. Still the results are similar
*/
auto start = high_resolution_clock::now();
cout<<sum(p1)<<endl;
auto stop = high_resolution_clock::now();
cout<<"Time taken Non constexpr: "<<duration_cast<microseconds>(stop - start).count()<<endl;
start = high_resolution_clock::now();
cout<<sum(p)<<endl;
stop = high_resolution_clock::now();
cout<<"Time taken constexpr: "<<duration_cast<microseconds>(stop - start).count()<<endl;
}
}
我的代码很简单,创建两个指针,一个是常量(p),另一个不是(p1)。当用p1 调用sum() 时,没有constexpr 的函数被调用,这可以通过 print "Calling sum 看到,当用p 调用时,带有constexpr 的函数被调用调用,可以看成什么都没有打印出来。
结果
$g++ -o main *.cpp
$主
调用 sum
5050
所用时间非 constexpr:63
5050
所用时间 constexpr:7
调用 sum
5050
所用时间非 constexpr:5
5050
所用时间 constexpr:6
.
.
.
.
调用 sum
5050
所用时间非 constexpr:2
5050
constexpr 所用时间:6
.
.
.
.
调用 sum
5050
所用时间非 constexpr:2
5050
constexpr 所用时间:2
【问题讨论】:
-
constexpr不是性能优化。您将它用于需要/可以在编译时完成的事情。 -
缓存问题?对于基准测试,始终启用优化。并且不要将输出包含在您的时间安排中。
-
您可能应该检查编译器为机器代码生成的内容。请注意,您的函数调用的结果与计时循环无关,因此编译器可以对其进行优化,以使其不计算多次?
-
如果使用非编译时间常量调用,constexpr 函数的行为类似于非 constexpr 函数。想一想,使用运行时参数,您无法进行编译时评估。也正如其他人评论的那样,输出操作是主要部分。
-
更改编译器选项并添加
-O2。没有人关心未优化代码的性能。
标签: c++ performance repeat constexpr