关于多循环多分支程序执行效率的可能优化方法

来源:互联网 发布:淘宝评论怎么评论内容 编辑:程序博客网 时间:2024/06/05 11:32

  请读者看下面的这个代码程序:

#include <stdio.h>int main(){  int a=100000,c;  while(a>1)  {scanf("%d",&c);    switch(c){      case 1:  printf("c是1");      break;  case 2:  printf("c是2");  break;  case 3:  printf("c是3");  break;  case 4:  printf("c是4");  break;      case 5:  printf("c是5");  break;}a--;  }  return 0;}


  看上面的代码,似乎并没有问题,就C语言而言,确实如此。但没问题不代表就是最优,天地万物都有进化的空间,语言也不例外。让我们还拿这个程序为例,思考一种不理想的情况:当c的值是5时,机器会如何运行这段代码呢?首先,机器会先测试c的值是不是1,如果不是,再测试c的值是不是2,如此类推循环,直至遇到正确值5为止【郑重声明:以上斜体字只是我个人的猜测!本人水平有限,有可能是错的,因为编译器完全可以用更复杂的方法编译出更优的执行机器码,所以请大家不要轻信!!在这里也作出一个恳求,如果我的猜测是错的,还望知情的大侠在见笑之余,能够指教小弟一二,谢谢!!】若真是这样,很显然,机器至少要浪费掉4个指令执行时间。所以,对于这种浪费,有没有一种可能的方法避免呢?

  为了配合上面的问题,请允许我胡编滥造出一个新的“D语言”,该语言全部继承自C,几乎与C一模一样。唯一的区别是比C多了个代码段地址类型,以及一个获取代码段地址的关键字getcodeadd,最后还多了一个动态的gotoadd行为。为了说得详细一点,请看下面的伪代码,该程序的目的和第一个程序一模一样:

#include <stdio.h>int main(){int a = 100000, c;    codad add[10]; // codad是一个“关键字”,类似int、char    add[1] = getcodeadd[1];//这个getcodeadd[1],在编译的后期,已经被替换为一个代码段地址值add[2] = getcodeadd[2];       add[3] = getcodeadd[3];add[4] = getcodeadd[4];    add[5] = getcodeadd[5];    while (a>1){scanf("%d", &c);        gotoadd(add[c]) // 根据c的具体数值,直接跳转到相应代码段地址        {         getcodeadd[1]: //后面多了一个“:”号,表示这是一个标记获取代码段地址的行为,以及编译的最后阶段该字符串不必被代码段地址替换              printf("c是1");           break;     getcodeadd[2]:   printf("c是2");       break;     getcodeadd[3]:   printf("c是3");   break;     getcodeadd[4]:   printf("c是4");   break;     getcodeadd[5]:    printf("c是5");    break;    }       a--;}    return 0;}


 

在编译这种“D语言”时,编译器会先检测程序代码有没有getcodeadd,如果有,就会建立一个地址表。在编译的最后阶段,编译器会扫描代码中所有带“:”号的getcodeadd,以便获取该getcodeadd所标记的代码段地址,并将获取的这个地址值填充进地址表相应的位置中。最后的最后,编译器会扫描代码中没有“:”号的getcodeadd,然后讲该字符串替换为地址表中相应的代码段地址数值......

  上面这个所谓的D语言,只是个人的瞎想,也许不可行。但不管怎样,欢迎拍砖,敬请指教,谢谢
 

3 0
原创粉丝点击