原文位址: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 好用但慎用