快捷搜索: 王者荣耀 脱发

while与for执行效率对比

  1. #include "stdio.h"
  2. void forTest()
  3. {
  4. int num = 1234; // 迭代次数
  5. long sum = 0; // 保存加法结果
  6. for(int i=0;i<num;i++) // 传统for循环写法
  7. {
  8. sum = sum + i; // 计算结果
  9. }
  10. printf("forTest:%d ",sum);
  11. }
  12. void whileTest()
  13. {
  14. int num = 1234; // 迭代次数
  15. long sum = 0; // 保存加法结果
  16. while((num--)>0)
  17. {
  18. sum = sum + num; // 计算结果
  19. }
  20. printf("whileTest:%d ",sum);
  21. }
  22. void main()
  23. {
  24. forTest();
  25. whileTest();
  26. }

whileTest()函数

0040D760~0040D776: 保存栈现场 总共10条指令 0040D778: 迭代次数 总共1条指令 0040D77F: 保存加法结果 总共1条指令 0040D786~0040D79F: while循环 总共10条指令 0040D7A1~0040D7AF: 打印结果 总共5条指令 0040D7B2~0040D7C2: 恢复栈现场 总共9条指令 合计: 36条指令

forTest()函数 0040D3F0~0040D406: 保存栈现场 总共10条指令 0040D408: 迭代次数 总共1条指令 0040D40F: 保存加法结果 总共1条指令 0040D416~0040D439: for循环 总共12条指令 0040D43B~0040D449: 打印结果 总共5条指令 0040D44C~0040D45C: 恢复栈现场 总共9条指令 合计: 38条指令

程序中for循环用的是传统写法,做下更改将for(int i=0;i<num;i++)改为for(;(num--)>0;)

0040D3F0~0040D406: 保存栈现场 总共10条指令 0040D408: 迭代次数 总共1条指令 0040D40F: 保存加法结果 总共1条指令 0040D416~0040D42F: for循环 总共10条指令 0040D431~0040D43F: 打印结果 总共5条指令 0040D442~0040D452: 恢复栈现场 总共9条指令 合计: 36条指令 由此可见,for循环习惯写法for(int i=0;i<num;i++)执行效率低于for(;(num--)>0;)写法,而for(;(num--)>0;)写法执行效率与while((num--)>0)相同.

一般来说,do..while循环要比for,while循环的效率要高,这点可以从你做过的汇编分析中看出,而且在深入理解计算机一书的第三章3.6.5节中的讲述也可以看出在对上述循环语句进行汇编时,会先将for,while转换为do..while。

经验分享 程序员 微信小程序 职场和发展