有道面试题:
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循环;
权当参考.