std::is_same 对代码的性能有影响吗?
does std::is_same has an impact on the performance of the code?
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 没有模板 duration:4041
R2: is_same duration:3954 没有模板 duration:3950
R3: is_same duration:3963 没有模板 duration:3973
R4: is_same duration:4008 没有模板 duration:4048
R5: is_same duration:3948 没有模板 duration:3998
R6: is_same duration:4130 没有模板 duration:4036
R7: is_same duration:3932 没有模板 duration:3948
R8: is_same duration:4183 没有模板 duration:4088
R9: is_same duration:4731 没有模板 duration:5062
R10: is_same duration:4018 没有模板 duration:4887
#交换测试#
R1: 没有模板 duration:5729 is_same duration:5474
R2: 没有模板 duration:3988 is_same duration:4039
R3: 没有模板 duration:3996 is_same duration:4114
R4: 没有模板 duration:4063 is_same duration:4068
R5: 没有模板 duration:3979 is_same duration:4096
R6: 没有模板 duration:4159 is_same duration:4020
R7: 没有模板 duration:3990 is_same duration:4086
R8: 没有模板 duration:4001 is_same duration:4055
R9: 没有模板 duration:4048 is_same duration:4088
**R10:**无模板duration:4070is_sameduration:4017
std:is_same 是一个编译时检查,它是用两个不同的模板足迹实现的。一个有 1 种类型,1 个有 2 种类型。
std::is_same<T, T> //If the compiler resolves to this it is the same type;
std::is_same<T, U> //If the compiler resolves to this it is 2 types;
实现 returns 一种类型,然后转换为 bool,解析为 true 或 false,生成代码遵循的路径。
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 没有模板 duration:4041
R2: is_same duration:3954 没有模板 duration:3950
R3: is_same duration:3963 没有模板 duration:3973
R4: is_same duration:4008 没有模板 duration:4048
R5: is_same duration:3948 没有模板 duration:3998
R6: is_same duration:4130 没有模板 duration:4036
R7: is_same duration:3932 没有模板 duration:3948
R8: is_same duration:4183 没有模板 duration:4088
R9: is_same duration:4731 没有模板 duration:5062
R10: is_same duration:4018 没有模板 duration:4887
#交换测试#
R1: 没有模板 duration:5729 is_same duration:5474
R2: 没有模板 duration:3988 is_same duration:4039
R3: 没有模板 duration:3996 is_same duration:4114
R4: 没有模板 duration:4063 is_same duration:4068
R5: 没有模板 duration:3979 is_same duration:4096
R6: 没有模板 duration:4159 is_same duration:4020
R7: 没有模板 duration:3990 is_same duration:4086
R8: 没有模板 duration:4001 is_same duration:4055
R9: 没有模板 duration:4048 is_same duration:4088
**R10:**无模板duration:4070is_sameduration:4017
std:is_same 是一个编译时检查,它是用两个不同的模板足迹实现的。一个有 1 种类型,1 个有 2 种类型。
std::is_same<T, T> //If the compiler resolves to this it is the same type;
std::is_same<T, U> //If the compiler resolves to this it is 2 types;
实现 returns 一种类型,然后转换为 bool,解析为 true 或 false,生成代码遵循的路径。