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是否花费大量的时间或性能,尤其是对于xresyres较大的值?在这种情况下,我试图将图像的颜色值存储在矩阵中,这意味着xresyres的值大约在500-2000左右。
答案
[方法1]在yres < xres时具有未定义的行为,因此有关其性能的问题尚无定论。

((在这种情况下,将存在yres <= xindex的迭代。由于xindex用于两个维度的索引,因此会导致对数组的访问超出范围。)损坏的代码简直是不好的选项,无论它中断多快。

方法2的性能非常差(除非您的编译器足够聪明,可以为您纠正它)。它有一个循环,可以循环多次,但是最多只能执行一次迭代。如果有人按照这些思路给您指示,那么称其为忙碌是有道理的。 (这有点像要求某人猜测您选择的号码与告诉某人您选择的号码。)这比破损的代码要好,但表明对指令的含义缺乏理解。

此方法的第一个改进是将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 ++:这两种将数字写入矩阵的方式之间在速度上有显着差异吗?的主要内容,如果未能解决你的问题,请参考以下文章

C语言中字符串之间的比较char*/string

数组是指针? [重复]

腾讯笔试3

spring cloud微服务之间的调用

在主机应用程序和今天的扩展程序之间共享用户生成的图像的最佳方式是啥

spark利用sparkSQL将数据写入hive两种通用方式实现及比较