原始代码:
1 for (int n = 0;n < 50000; n++) 2 { 3 for (int i = 0;i < height;i++) 4 { 5 for (int j = 0;j < width;j++) 6 { 7 if (grayImg.data[i * width + j] > thresh) 8 { 9 binImg.data[i * width + j] = 0; 10 } 11 else if (grayImg.data[i * width + j] <= thresh) 12 { 13 binImg.data[i * width + j] = 255; 14 } 15 } 16 } 17 }
代码总计运行14.513秒;
查看代码所耗时间分布:
1、右键项目->属性->配置属性->C/C++->优化:选择完全优化
2、分析->性能探测器->勾选CPU选项->开始测试->完成后创建详细的报告
下图为代码所耗时间分布,可以看到if语句消耗时间最长,占68.3%
优化1:由于if...else if...语句已经将所有情况包含,所以else if语句后面的判断条件可以不写(从时间上可以看到编译器自动将这行代码优化掉了,不耗时间)
优化2:if语句耗时最多,原因在于 i * width + j 这个计算执行过多,可以将i * width 赋值给index1并移到i和j两个for循环之间,然后赋值index2 = index1 + j并放置在if语句之前
优化后的代码如下:
1 for (int n = 0;n < 50000; n++) 2 { 3 for (int i = 0;i < height;i++) 4 { 5 int index1 = i * width; 6 for (int j = 0;j < width;j++) 7 { 8 int index2 = index1 + j; 9 if (grayImg.data[index2] > thresh) 10 { 11 binImg.data[index2] = 0; 12 } 13 else 14 { 15 binImg.data[index2] = 255; 16 } 17 } 18 } 19 }
优化后代码执行所需时间为11.518,时间有所减少
可以看到依然是if语句最耗时
查看反汇编指令:
1、关闭“优化”选项
2、在第一个for循环最后设置断点
3、F5
4、编辑区右键->转到反汇编
可以看到上图反汇编指令
代码1下面有3条指令,指令越少,消耗时间越少,可以根据指令行数判断是否优化