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

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

#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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值