我有下一个问题。我的代码性能取决于操作的数量!怎么可能呢?(我在openSuse 11.1下使用gcc诉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-时间-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
也有图片,但我不能张贴它造成新用户的限制。但这是测井图。
这次放缓的原因是什么?如何摆脱它?请帮助!
发布于 2010-12-27 20:53:03
您的内部循环每次都会增加迭代次数--如果需要进行更多的计算,则需要更多的时间来完成它们的工作。第一次有100 k操作要做,第二次有105 k操作,等等。它只需要越来越多的时间。
编辑:更清楚的是,我试着说它看起来像斯波斯基所说的http://www.joelonsoftware.com/articles/fog0000000319.html
发布于 2010-12-28 13:05:21
非常感谢你的回应!
我的期望基于这样的想法,即每个时间单位的操作数应该保持不变。因此,如果我增加运算的次数,比如说两次,那么计算时间也应该增加两倍,因此运算次数和计算时间的比率应该是恒定的。这是我没见过的东西。:(
https://stackoverflow.com/questions/4541649
复制相似问题