第一次编写的测试代码,测试代码,函数直接传值,内部也在拷贝值
1 struct PP{ 2 float x; 3 float y; 4 float z; 5 }; 6 7 PP lots_of_copies(PP a, PP b){ 8 PP c; 9 c = b; 10 b = a; 11 return c; 12 } 13 void lots_of_copies_2(PP a, PP b, PP& c){ 14 c = b; 15 b = a; 16 } 17 void test_func1() 18 { 19 PP a{1.01, 1.75, 2.45}; 20 PP b{1.21, 1.95, 4.25}; 21 PP c; 22 for(int i = 0; i < 10000000; i++){ 24 c = lots_of_copies(a, b); 25 } 26 } 27 28 int main() 29 { 30 test_func1(); 31 return 0; 32 }
不优化编译执行耗时60毫秒,O1优化编译以后耗时直接降低到2毫秒。30倍以上的性能提升。
第二次代码稍微改变一下
1 struct PP{ 2 float x; 3 float y; 4 float z; 5 }; 6 7 PP lots_of_copies(PP a, PP b){ 8 PP c; 9 c = b; 10 b = a; 11 return c; 12 } 13 void lots_of_copies_2(PP a, PP b, PP& c){ 14 c = b; 15 b = a; 16 } 17 void test_func1() 18 { 19 PP a{1.01, 1.75, 2.45}; 20 PP b{1.21, 1.95, 4.25}; 21 PP c; 22 for(int i = 0; i < 10000000; i++){ 23 //c = lots_of_copies(a, b); 24 lots_of_copies_2(a, b, c); 25 } 26 } 27 28 int main() 29 { 30 test_func1(); 31 return 0; 32 }
代码优化主要把函数的返回传值去掉,改为走引用传递,发现不优化的清空下性能提升到46毫秒,有提升,但是差别不大,带优化编译以后的效果是一样的。
所以编译器还在其他地方做了更大的优化,来提升性能
暂时还没想明白,记录后续想明白了再记录下来