【发布时间】:2020-11-12 10:25:11
【问题描述】:
is_same 对代码性能有影响吗?我在我的代码中多次使用它来检查我是否必须使用std::less 或std::greater,并且根据它们我必须检索特定的值。我的测试是否足以证明 std::is_same 在我的案例中并没有真正影响代码的性能?
代码比这复杂得多,我必须使用模板。我尽可能多地模仿使用is_same 的地方。
我使用-O3 编译器选项编译并运行了代码。
#include <iostream>
#include <vector>
#include <chrono>
using namespace std::chrono;
using namespace std;
template<typename T>
int returnVal(T compare) {
std::vector<int> v = {1,2,3,4};
if(std::is_same<T,std::greater<int>>::value) {
return std::min(v[0], v[1], compare);
} else {
return std::min(v[2], v[3], compare);
}
}
int returnValNoTemplate(bool b) {
std::vector<int> v = {1,2,3,4};
if(b == true) {
return std::min(v[0], v[1]);
} else {
return std::min(v[2], v[3]);
}
}
int main()
{
for(int i = 0; i < 10; i++) {
auto start = high_resolution_clock::now();
for(int i = 0; i < 100000;++i) {
int x = returnVal(std::greater<int>());
}
auto stop = high_resolution_clock::now();
auto duration = duration_cast<microseconds>(stop - start);
cout <<"is_same duration:" << duration.count() << "\n" << endl;
auto start1 = high_resolution_clock::now();
for(int i = 0; i < 100000;++i) {
int y = returnValNoTemplate(true);
}
auto stop1 = high_resolution_clock::now();
auto duration1 = duration_cast<microseconds>(stop1 - start1);
cout <<"No template duration:" << duration1.count() << "\n" << endl;
}
return 0;
}
R1: is_same duration:4052 No template duration:4041
R2: is_same 持续时间:3954 无模板持续时间:3950
R3: is_same duration:3963 No template duration:3973
R4: is_same duration:4008 No template duration:4048
R5: is_same 持续时间:3948 无模板持续时间:3998
R6: is_same duration:4130 No template duration:4036
R7: is_same duration:3932 No template duration:3948
R8: is_same duration:4183 No template duration:4088
R9: is_same duration:4731 No template duration:5062
R10: is_same duration:4018 No template duration:4887
#交换测试#
R1:无模板持续时间:5729 is_same 持续时间:5474
R2:无模板持续时间:3988 is_same duration:4039
R3:无模板持续时间:3996 is_same duration:4114
R4:无模板持续时间:4063 is_same duration:4068
R5:无模板持续时间:3979 is_same 持续时间:4096
R6:无模板持续时间:4159 is_same duration:4020
R7:无模板持续时间:3990 is_same duration:4086
R8:无模板持续时间:4001 is_same duration:4055
R9:无模板持续时间:4048 is_same duration:4088
**R10:**无模板持续时间:4070 is_same duration:4017
【问题讨论】:
-
如果是这样,我会感到惊讶。我一直假设这些检查发生在编译时,并生成函数来处理每种类型
-
在测试性能时,在启用编译器优化的情况下测试代码构建是非常重要的。on(也称为“发布构建”)。大多数编译器的默认设置是进行未优化(也称为“调试”)的构建。众所周知,未优化的构建速度很慢,并且通常在优化构建完全消除的地方。不要对调试版本进行基准测试,这毫无意义,并且根本无法反映最终发布版本的真实性能。
-
理论上模板版本可以表现得更好,因为
std::is_same在编译时被解析。由于您将常量值传递给另一个版本,我希望编译器在这种情况下为两者生成相同的程序集。不过,我怀疑这种差异几乎无法察觉。 -
std::is_same是一个编译时间常数,就好像你用true或false代替它一样。因此,性能特征将与使用文字true或false值相同——编译器肯定会消除条件分支和错误分支(gcc 和 clang 都会这样做,即使使用-O0)。跨度> -
交换测试顺序也可能改变结果
标签: c++ templates performance-testing