7/27/2010

c语言中for循环和while循环效率比较试验

有道面试题:

for(i = 0; i < 100; i++)

{

XXX;

}

题目要求你不去考虑循环体的代码XXX,从for循环的特点去入手提高程序执行的效率.

据说标准答案是这样的:

由于c语言中i = 0; 只运行一次,也没有办法优化;

i++对于大多数编译器来说已经是最简练的代码了;

i < 100 会有优化的余地,即将100用#define N 100 来定义,然后将代码改为 i < N

这样对于超大规模的数据运算会有效率上的帮助.

---------------------------------------------------------------------------

下面是我针对这种题目做的一个实验:

分别有普通的for循环,预定义N值的for循环,逆序的for循环(for(i = N; i > 0; i++));和对应的while循环.

循环体中的代码分别为空循环,求和,赋值.

用clock_t来计时,并没用转换为标准的时分秒.

clcok_t是CPU时钟计时单元.

实验结果:
空循环continue;实验

for(i = 0; i < 100000000; i++)

239  238  238  240  238  242  240  240  241  239  2395

for(i = 0; i < N; i++)

241  238  239  238  239  240  237  239  241  239  2391

for(i = N; i > 0; i--)

240  238  239  238  239  237  238  238  238  239  2384

i = 0;    while( i++ < 100000000)

247  244  243  245  243  246  247  247  243  243  2448

i = 0;    while( i++ < 100000000);

247  243  243  244  241  245  244  244  245  244  2440

i = 0;    while( i++ < N)

245  245  243  245  243  245  244  245  241  244  2440

i = 0;    while( i++ < N);

244  242  245  245  244  247  244  246  243  244  2444

i = 100000000;  while( i-- > 0)

246  245  243  243  244  244  244  245  246  245  2445

i = 100000000;  while( i-- > 0);

246  244  244  241  243  244  242  244  246  244  2438

i = N;    while(i-- > 0)

244  246  245  246  244  244  245  246  245  248  2453

i = N;    while(i-- > 0);

273  245  245  244  246  244  246  245  245  245  2478

========================================================

sum += i;实验

for(i = 0; i < 100000000; i++)

560  560  559  558  558  558  557  558  559  559  5586

for(i = 0; i < N; i++)

560  559  558  557  556  556  558  559  558  557  5578

for(i = N; i > 0; i--)

559  559  559  559  561  559  560  561  558  559  5594

558  560  558  558  560  557  558  558  557  557  5581

559  559  558  558  559  557  560  560  559  558  5587

i = 0;    while( i++ < 100000000)

512  511  511  512  509  512  511  509  510  511  5108

i = 0;    while( i++ < N)

512  512  511  511  511  511  510  512  513  512  5115

512  512  512  510  512  510  512  512  510  510  5112

i = 100000000;  while( i-- > 0)

526  525  526  524  526  526  525  525  524  525  5252

i = N;    while(i-- > 0)

525  525  525  524  525  524  525  525  524  524  5246

525  525  526  525  524  525  526  524  525  524  5249

========================================================

sum = i;实验

for(i = 0; i < 100000000; i++)

360  363  362  361  361  361  360  361  360  360  3609

for(i = 0; i < N; i++)

362  361  360  361  360  361  361  361  361  361  3609

for(i = N; i > 0; i--)

362  362  361  362  362  362  360  361  361  361  3614

i = 0;    while( i++ < 100000000)

258  257  257  257  256  259  257  258  257  258  2574

i = 0;    while( i++ < N)

257  257  258  257  257  257  257  257  257  257  2571

i = 100000000;  while( i-- > 0)

313  313  312  313  313  311  313  311  313  312  3124

i = N;    while(i-- > 0)

312  311  313  310  312  312  313  312  310  312  3117

end

---------------------------------------------------------------------

当然这个实验是相当片面的,实际运行时间会受到机器配置,语言编译器等诸多因素的影响.

不过从实验结果可以看出这几点:

1.预定义并没有明显地提高效率;

2.i > 0 和 i < n 的效率相差的并不太多,当然需要进一步的分析在汇编乃至机器码中是如何实现大小的比较才能得到比较靠谱的结论;

3.某些情况下while的效率要明显好于for循环;

权当参考.