第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

為什么編譯器會(huì)在 switch 中添加語(yǔ)句?

為什么編譯器會(huì)在 switch 中添加語(yǔ)句?

C#
BIG陽(yáng) 2022-06-18 17:37:51
我有以下相當(dāng)簡(jiǎn)單的 switch 語(yǔ)句。// 較早的字符串 fullPath = GetFullPath(); 字符串類型 = GetEntityType();switch (type.ToLower()) {    case "tables":        tables.Add(fullPath);        break;    case "views":        views.Add(fullPath);        break;    case "functions":        functions.Add(fullPath);        break;    case "storedprocs":        storedprocs.Add(fullPath);        break;    case "data":        data.Add(fullPath);        break;    case "layouts":        layouts.Add(fullPath);        break;    case "scripts":        scripts.Add(fullPath);        break;    default:        Console.WriteLine($"What is this: {type}");        break;}當(dāng)我使用 Reflector 反編譯生成的二進(jìn)制文件時(shí),switch(string)它已更改為 ComputeStringHash,然后在每個(gè) case 語(yǔ)句中,它通過if語(yǔ)句檢查值。聽起來它正在做雙倍的工作。    string s = str2.ToLower();    switch (<PrivateImplementationDetails>.ComputeStringHash(s))    {        case 0x20890fc4:            if (s == "tables")            {                break;            }            goto Label_0218;        case 0x454a414e:            if (s == "functions")            {                goto Label_01DE;            }            goto Label_0218;        case 0x4facf6d1:            if (s == "views")            {                goto Label_01D3;            }            goto Label_0218;        case 0xcdfe2cb3:            if (s == "storedprocs")            {                goto Label_01E9;            }            goto Label_0218;        case 0xd872e2a5:            if (s == "data")            {                goto Label_01F4;            }            goto Label_0218;        case 0x9b4a129b:            if (s == "scripts")            {                goto Label_020C;            }            goto Label_0218;        case 0xba971064:            if (s == "layouts")            {                goto Label_0200;            }            goto Label_0218;        default:            goto Label_0218;    }
查看完整描述

1 回答

?
九州編程

TA貢獻(xiàn)1785條經(jīng)驗(yàn) 獲得超4個(gè)贊

這是一個(gè)非常聰明的優(yōu)化,它可以讓幾乎獨(dú)立于語(yǔ)句塊中的switch字符串?dāng)?shù)量的時(shí)間來完成它的工作。case

這種優(yōu)化是基于觀察到相同字符串的哈希碼必須相同。編譯器不是逐個(gè)檢查字符串是否相等,而是計(jì)算一次目標(biāo)字符串的哈希,并在 O(1) 中執(zhí)行基于表的查找。這使編譯器達(dá)到所需的情況,此時(shí)編譯器需要檢查字符串是否實(shí)際相等。

請(qǐng)注意,當(dāng)多個(gè)查找字符串具有相同的哈希碼時(shí),會(huì)出現(xiàn)一些罕見的情況。在這種情況下,生成的case語(yǔ)句將包含多個(gè)if以在具有相同哈希碼的字符串中做出決定。

總的來說,這種行為模仿了基于散列的字典的行為:散列碼確定case(相當(dāng)于散列桶),而里面的一系列ifs 確定是否存在匹配。這會(huì)帶來更好的性能,因?yàn)樗梢宰尵幾g器跳過不必要的檢查。


查看完整回答
反對(duì) 回復(fù) 2022-06-18
  • 1 回答
  • 0 關(guān)注
  • 166 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)