C ++:这两种将数字写入矩阵的方式之间在速度上有显着差异吗?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C ++:这两种将数字写入矩阵的方式之间在速度上有显着差异吗?相关的知识,希望对你有一定的参考价值。
我想知道以下两种在矩阵对角线中存储数字的方式之间在速度/性能上是否存在显着差异:
方法1:
//...
int matrix[xres][yres];
for(yindex = 0; yindex < yres; yindex += 1){
for(xindex = 0; xindex < xres; xindex += 1){
matrix[xindex][xindex] = 1;
}
}
方法2:
//...
int matrix[xres][yres];
for(yindex = 0; yindex < yres; yindex += 1){
for(xindex = 0; xindex < xres; xindex += 1){
if(xindex == yindex){
matrix[xindex][yindex] = 1;
}
}
}
我想说的是,在[[方法1中,代码更容易阅读,也更紧凑。方法2仅在当前矩阵元素位于对角线上的情况下才写入内存,其中方法2将在for循环的每个循环中写入。
方法1是否花费大量的时间或性能,尤其是对于xres
和yres
较大的值?在这种情况下,我试图将图像的颜色值存储在矩阵中,这意味着xres
和yres
的值大约在500-2000左右。yres < xres
时具有未定义的行为,因此有关其性能的问题尚无定论。 ((在这种情况下,将存在yres <= xindex
的迭代。由于xindex
用于两个维度的索引,因此会导致对数组的访问超出范围。)损坏的代码简直是不好的选项,无论它中断多快。
此方法的第一个改进是将xindex
设置为一个使用的值,而不是遍历所有允许的值并检查当前值是否为所需值。
int matrix[xres][yres];
for(yindex = 0; yindex < yres; yindex += 1){
xindex = yindex; // The only value for which we have something to do.
if ( xindex < xres ){ // Keep this check from the old inner loop!
matrix[xindex][yindex] = 1;
}
}
注意,仍然需要检查xindex < xres
。如果这种情况消失了,我们将得到破坏的代码,类似于破坏方法1的方式。第二个改进是意识到不再需要两个变量。
int matrix[xres][yres]; for(unsigned index = 0; index < yres; index += 1){ if ( index < xres ){ matrix[index][index] = 1; } }
第三项改进涉及到认识到,一旦条件index < xres
失败,它将对index
的所有较大值(因此对于所有后续迭代)都失败。因此我们可以将条件移入循环。
int matrix[xres][yres]; for(unsigned index = 0; index < yres && index < xres; index += 1){ matrix[index][index] = 1; }
此时仍可以进行一些样式上的更改,但是与已完成的操作相比,它们对性能的任何影响都将很小。实际上,如果使用基本优化来编译代码,它们可能根本不会影响性能。因此,对于阅读更清晰的内容,更多地成为判断力。
int matrix[xres][yres]; for(unsigned index = 0; index < std::min(xres, yres); ++index){ matrix[index][index] = 1; }
如果要解决方法1,然后应用类似的简化方法,最终结果可能相同。
以上是关于C ++:这两种将数字写入矩阵的方式之间在速度上有显着差异吗?的主要内容,如果未能解决你的问题,请参考以下文章