我前端时间曾经写过一篇博客,关于如何提高switch运行效率的。碰巧的是,昨天在知乎上,看到R大关注的一个问题:(
如果穿越成1972年的Dennis Ritchie,你会怎样重新设计C语言?
),当时我以为这个问题正好撞我“枪口”上,所以斗胆回答了一发:
(如果我拥有C之父的示例,我想我会在switch上做手脚,做一个switch的姐妹版,比如叫【gotoswitch】,用它来专门替换多循环、多分支情况下的switch。
大概原理这样:当编译器发现程序中有gotoswitch时,会在全局区开辟出一段数组空间,比如叫【go_code_add】,用它来存放gotoswitch体中的各种跳转地址,这个数组中的所有元素,默认初始化为【go_default】的指令地址。举例说明,机器进入【gotoswitch】体中编译时,遇到了语句【go_case 7:】,那么编译器先把紧挨着语句【go_case 7:】的下一条指令地址提取出来,赋值给数组首地址往后偏移7个位置的元素中。这样的话,程序在执行到gotoswitch时,如果gotoswitch圆括号内表达式所产生的值是7,那么就直接跳转到【 go_code_add[7] 】这个元素所保存的指令地址中。这样的话,我想多少都会提高运行时效率吧),
回答后没过多长时间,有幸得到轮子哥的点评:(这个优化早就有了),这才一语惊醒梦中人,难道我以前关于switch体的认知都是自欺欺人?人家真正的面貌不知道比我想象的要高到哪里去了??于是我就在vc6上做了一次简单的小测验,结果证明前辈们确实高出我很多很多,所以写成这篇博客,算是巩固记忆吧。以下正文开始:
先上测验用的源代码: