亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如果與開關速度

如果與開關速度

紫衣仙女 2019-10-08 15:21:06
由于編譯器的優化,switch語句通常比等效的if-else-if語句(如本文中所述)要快。這種優化實際上是如何工作的?有人有很好的解釋嗎?
查看完整描述

4 回答

?
森林海

TA貢獻2011條經驗 獲得超2個贊

這是一個略微的簡化,因為通常任何現代編譯器遇到的if..else if ..序列都可能被人輕易地轉換為switch語句,編譯器也將如此。但是只是為了增加樂趣,編譯器不受語法的限制,因此可以在內部生成“ switch”之類的語句,這些語句混合了范圍,單個目標等,并且它們可以(也可以)對switch和if做到這一點。 .else語句。


順便說一句,Konrad答案的擴展是編譯器可以生成一個跳轉表,但這不一定能保證(也不可?。?。出于各種原因,跳轉表對現代處理器上的分支預測器不利,而表本身對緩存行為不利。


switch(a) { case 0: ...; break; case 1: ...; break; }

如果編譯器為此實際生成了一個跳轉表,則if..else if..由于跳轉表使分支預測失敗,因此替代樣式代碼的運行速度可能會更慢。


查看完整回答
反對 回復 2019-10-08
?
波斯汪

TA貢獻1811條經驗 獲得超4個贊

Switch / case語句通??梢愿斓剡_到1級深度,但是當您開始使用2級或2級以上語句時,switch / case語句的開始時間是嵌套if / else語句的2-3倍。


本文有一些速度比較,突出顯示了嵌套此類語句時的速度差異。


例如,根據他們的測試,示例代碼如下:


if (x % 3 == 0)

            if (y % 3 == 0)

                total += 3;

            else if (y % 3 == 1)

                total += 2;

            else if (y % 3 == 2)

                total += 1;

            else

                total += 0;

        else if (x % 3 == 1)

            if (y % 3 == 0)

                total += 3;

            else if (y % 3 == 1)

                total += 2;

            else if (y % 3 == 2)

                total += 1;

            else

                total += 0;

        else if (x % 3 == 2)

            if (y % 3 == 0)

                total += 3;

            else if (y % 3 == 1)

                total += 2;

            else if (y % 3 == 2)

                total += 1;

            else

                total += 0;

        else

            if (y % 3 == 0)

                total += 3;

            else if (y % 3 == 1)

                total += 2;

            else if (y % 3 == 2)

                total += 1;

            else

                total += 0;

在等效的switch / case語句運行一半的時間內完成了:


switch (x % 3)

    {

        case 0:

            switch (y % 3)

            {

                case 0: total += 3;

                    break;

                case 1: total += 2;

                    break;

                case 2: total += 1;

                    break;

                default: total += 0;

                    break;

            }

            break;

        case 1:

            switch (y % 3)

            {

                case 0: total += 3;

                    break;

                case 1: total += 2;

                    break;

                case 2: total += 1;

                    break;

                default: total += 0;

                    break;

            }

            break;

    case 2:

            switch (y % 3)

            {

                case 0: total += 3;

                    break;

                case 1: total += 2;

                    break;

                case 2: total += 1;

                    break;

                default: total += 0;

                    break;

            }

            break;

    default:

        switch (y % 3)

        {

            case 0: total += 3;

                break;

            case 1: total += 2;

                break;

            case 2: total += 1;

                break;

            default: total += 0;

                break;

        }

        break;

    }

是的,這是一個基本的例子,但它說明了這一點。


因此,對于僅深一層的簡單類型,可能會使用switch / case來得出結論,但對于更復雜的比較和多個嵌套的層,則使用經典的if / else構造?


查看完整回答
反對 回復 2019-10-08
?
MM們

TA貢獻1886條經驗 獲得超2個贊

不匹配的統計信息可能不好。

如果您實際下載源,則在if和switch情況下,不匹配值都已知為21。編譯器應該能夠抽象出來,知道應該始終運行哪個語句,并且CPU應該能夠正確分支預測。

在我看來,更有趣的情況是并非所有情況都中斷了,但是這可能不是實驗的范圍。


查看完整回答
反對 回復 2019-10-08
  • 4 回答
  • 0 關注
  • 737 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號