繁体   English   中英

C++:这两种将数字写入矩阵的方式之间是否存在显着的速度差异?

[英]C++: Is there a significant speed difference between these two ways of writing numbers to a matrix?

我想知道以下两种将数字存储在矩阵对角线上的方式之间是否存在显着的速度/性能差异:

方法一:

//...
int matrix[xres][yres];

for(yindex = 0; yindex < yres; yindex += 1){
    for(xindex = 0; xindex < xres; xindex += 1){
        matrix[xindex][xindex] = 1;
    }
}

方法二:

//...
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仅写入 memory,其中方法 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,然后应用类似的简化,您最终可能会得到相同的最终结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM