2

我看到了一个循环的示例,该循环应该比之后的循环慢:

for (i = 0; i < 1000; i++) 
   column_sum[i] = 0.0;
     for (j = 0; j < 1000; j++)
        column_sum[i] += b[j][i];

与此相比:

for (i = 0; i < 1000; i++)
     column_sum[i] = 0.0;
for (j = 0; j < 1000; j++)
     for (i = 0; i < 1000; i++)
        column_sum[i] += b[j][i];

现在,我编写了一个工具来测试不同索引号的数量,但是在我尝试了这个概念之后,我并没有看到太多的性能优势,而且我担心我的代码与它有关......

应该是在我的代码中工作的较慢循环:

    for (i = 0; i < val; i++){
        column_sum[i] = 0.0;
        for (j = 0; j < val; j++){
            int index = i * (int)val + j;
            column_sum[i] += p[index];
        }
    }

应该是“显着”更快的代码:

    for (i = 0; i < val; i++) {
        column_sum[i] = 0.0;
    }
    for (j = 0; j < val; j++) {
        for (i = 0; i < val; i++) {
            int index = j * (int)val + i;
            column_sum[i] += p[index];
        }
    }

数据对比:

在此处输入图像描述

4

1 回答 1

0

我混淆了循环中的索引值:int index = j * (int)val + i;

较慢的循环:

    for (i = 0; i < val; i++) {
        column_sum[i] = 0.0;
        for (j = 0; j < val; j++){
            int index = j * (int)val + i;
            column_sum[i] += p[index];
        }
    }

更快的循环:

    for (i = 0; i < val; i++) {
        column_sum[i] = 0.0;
    }
    for (j = 0; j < val; j++) {
        for (i = 0; i < val; i++) {
            int index = j * (int)val + i;
            column_sum[i] += p[index];
        }
    }
于 2014-09-15T15:46:20.287 回答