原文地址:http://www.cnblogs.com/xie4529298/archive/2012/03/27/2012-3-26.html
关于IF(){}else(){} 和 switch() case的执行效率
执行效率谁高? 当被问到这个问题,一下子蒙了,因为以前见过没听过这样的问题
但是既然问道了这个问题就短暂了思考了下:
我说出了我的想法:
If()else()的效率高一些,因为呢以前貌似听老师提到过switchcase 其本意还是IF else, 每一个switch case都可以转换为if else,就大胆猜想了下,switch case 的是if else的再次封装,追究其执行效率应该还是if else 快,可是仔细一想,又觉的不对,因为switch case 进入判断执行case的时候只执行一次,假如需判断的条件才if () else()里是最后一个那么这种情况下 switch case的执行效率比if else高
这样一来的话,就纠结了…..
本着大胆猜想,小心取证的原则,于是有了一下两种猜想:
猜想一:
Ifelse 执行效率高;
原因:就像前面提到的猜想switch case 是if else的再次封装所以它的执行效率高
猜想二:
Switchcase 执行效率高
原因:执行同样的逻辑判断 IFelse 的逻辑判断在最后一个,那么它的从第一个开始判断每次经过if 在经过else 在经过if ….那么在switch case 里呢,只需判断其case部分在执行其case下的内容..这样比较的话 switch case的效率貌似比if else的高…
但是呢 这也仅仅是猜想罢了 没有实证的话 猜想 仅仅是猜想 没有说服自己的理由
于是就开始取证
计划在执行逻辑部分的{} 和 switch case分别加入 一个时间 执行结束后分别打印出所需时间….
计划随好,却难以执行,因为,逻辑太短的话 根本就比较不出什么 在一个 难道没事去写一个最少有几百个逻辑的ifelse switch case 么第一感觉 太麻烦了吧 于是放弃了这个想法..
都说好多发明都是懒人发明出来的..
这个办法太麻烦,然后问别人 别人建议用汇编看,写了一段简短代码,直接设断点调试,分别调试if else 和 switch case
调试结果 if else 想最终的猜想那样 必须的是一步步来执行的
但是 switch case 的结果却不仅仅是猜想的那样
到执行switch的时候 首先会先把case 部分成一块一块的 即 case “XXX” 转换为0Xf……其实它是把case部分执向了一个地址 然后这个地址在做case的内容
表达能力有限,如果你看到调试过程 你会更清楚
这样看来的话 switchcase 的执行效率比if else的效率要高从汇编里面看,stwitch case 是if else的再次封装就不攻自破了
在取证的过程中 白了下度.
其结果 跟取证后的结果一样 但是还是有意外发现而不是有意外发生
如果if else 有3~4的话 两个的效率差不多 推荐使用if else 若超过4个以上,推荐switch case 原文是英文的 整不明白 大致翻译结果就是那个样
至于原因也没深究,想想也是的,就没在做进一步的深究
想想自己写的代码,也是这样做的,但是其原先却不是这个本意,就着代码看起来整洁 清爽才那样做的,久而久之就养成了习惯,小小深究一下却也还挺有那个缘分 误打误撞呀
这里还遇到过一个问题 就是 goto 的问题
咂一听以为是SQL里面的,后来别人解释了下其作用,跳出嵌套循环到执行的内容
分别说到了C# 和汇编的解决办法
C# 就是定义全局变量 接受 处理 一层层的天跳出来 或 break 或return (注:是嵌套循环)
汇编呢就是用goto 直接可以跳到指定的内容
感觉这个方法挺不错的于是就想C#有没有呢查下呗
于是乎MSDN了下 C# 也有 goto 意思是一样的
微软真是伟大
下面是MSDN的解释
goto 的一个通常用法是将控制传递给特定的 switch-case 标签或 switch 语句中的默认标签。
goto 语句还用于跳出深嵌套循环。
简单来说就是跳到指定的内容 MSDN上的例子 看一下就能明白
了解到了之后给他们说了下,有人又建议goto 好用但是慎用因为它可以跳到指定的内容就存在进程之间的跳转或内存之间的跳转稍有不慎 就会有意外的惊喜
至于它的缺点,我也不是很明白 也没说清楚
总之 goto 好用但慎用