关于多循环多分支程序执行效率的可能优化方法
来源:互联网 发布:淘宝评论怎么评论内容 编辑:程序博客网 时间: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语言,只是个人的瞎想,也许不可行。但不管怎样,欢迎拍砖,敬请指教,谢谢
- 关于多循环多分支程序执行效率的可能优化方法
- 关于大数循环效率优化的方法(C#)
- 关于for循环的执行效率问题
- 关于for循环的执行效率问题
- 关于SQL执行效率的优化
- 优化sql语句执行效率的方法
- 关于循环执行效率问题
- ABAP程序执行效率优化
- 关于for循环的执行效率的问题
- 关于多层for循环迭代的效率优化问题
- ++循环与i--循环的执行效率
- js:优化javascript的执行效率一些方法
- 常用优化sql语句执行效率的方法
- C/C++语言执行效率的优化方法(待续)
- 关于静态方法与非静态方法的执行效率
- OpenMP: 程序for循环并行效率优化
- php 关于程序提高执行效率的方面
- 优化ADO的执行效率
- poj 3660 Cow Contest(warshall算法)
- SpringMvc+Spring+Mybatis 环境集成
- iOS Quartz2D - 画圆和圆弧
- 07-31 面向对象
- 计时器(Chronometer)
- 关于多循环多分支程序执行效率的可能优化方法
- 黑马程序员-C语言printf和scanf函数中格式控制符使用小结
- css页面布局5.6
- 背包问题
- java List在arrayList()括号里初始化List
- linux c++ 高并发tcp服务器架构
- 机房收费总结
- hdu 3342 Legal or Not(拓扑)
- UVA 439 Knight Moves