0

我有下一个问题。我的代码性能取决于操作次数!怎么会这样?(我在 openSuse 11.1 下使用 gcc v 4.3.2)

这是我的代码:

#define N_MAX 1000000

typedef unsigned int uint;

double  a[N_MAX];
double  b[N_MAX];
uint n;

int main(){


    for (uint i=0; i<N_MAX; i++) {
            a[i]=(double)rand()/RAND_MAX;
    }


    for (uint n=100000; n<500000; n+=5000) {

        uint time1 = time(NULL);

        for (uint i=0; i<n;++i)
            for (uint j=0;j<n;++j)
                    b[j] = a[j]; 

        uint time2 = time(NULL);

        double time = double(time2-time1);

        printf("%5d ", n);
        printf("%5.2f %.3f\n", time, ((double)n*n/time)/1e9);

    }

    return 0;
}

这是结果日志:

n-time-Gflops (=)
200000 23.00 1.739
205000 24.00 1.751
210000 25.00 1.764
215000 26.00 1.778
220000 27.00 1.793
225000 29.00 1.746
230000 30.00
1.763 235000 32.00 1.726
240000 32.00 1.800
245000 34.00 1.765
250000 36.00 1.736 255000
37.00 1.757
260000 38.00 1.779
265000 40.00 1.756
270000 42.00 1.736
275000 44.00 1.719
280000 46.00 1.704
285000 48.00 1.692
290000 49.00 1.716
295000 51.00 1.706
300000 54.00 1.667
305000 54.00 1.723
310000 59.00 1.629
315000 61.00 1.627
320000 66.00 1.552
325000 71.00 1.488
330000 76.00 1.433
335000 79.00 1.421
340000 84.00 1.376
345000 85.00 1.400
350000 89.00 1.376
355000 96.00 1.313
360000 102.00 1.271
365000 110.00 1.211
370000 121.00 1.131
375000 143.00 0.983
380000 156.00 0.926
385000 163.00 0.909

还有图像,但由于新用户限制,我无法发布它。但这里是对数图

这种放缓的原因是什么?如何摆脱它?请帮忙!

4

2 回答 2

1

您的内部循环每次都会增加迭代次数 - 如果需要进行更多计算,则预计需要更多时间来完成它们的工作。第一次有 100k 操作要完成,第二次有 105k 操作,依此类推。它必须花费越来越多的时间。

编辑:为了更清楚,我试图说它看起来像 Spolsky 称之为画家算法的 Shlemiel

于 2010-12-27T20:53:03.733 回答
0

非常感谢您的回复!

我的期望基于每个时间单位的操作数应该保持不变的想法。所以如果我增加操作次数,比如说两次,那么计算时间也应该增加两次,因此操作次数和计算时间的比率应该是恒定的。这是我没有遇到的事情。:(

于 2010-12-28T13:05:21.707 回答