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

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

在C#中使用if/etc和Switch-case有什么顯著的區(qū)別嗎?

在C#中使用if/etc和Switch-case有什么顯著的區(qū)別嗎?

慕的地8271018 2019-07-01 16:42:17
在C#中使用if/etc和Switch-case有什么顯著的區(qū)別嗎?使用switch語(yǔ)句訴aif/else在C#。我無(wú)法想象有那么大的不同,除了您的代碼的外觀。產(chǎn)生的IL或相關(guān)的運(yùn)行時(shí)性能會(huì)有根本不同的原因嗎?有關(guān):什么更快,打開字符串還是輸入?
查看完整描述

3 回答

?
慕碼人2483693

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

開關(guān)語(yǔ)句僅在調(diào)試或兼容模式下生成與IFS相同的程序集。在發(fā)行版中,它將被編譯成跳轉(zhuǎn)表(通過MSIL‘Switch’語(yǔ)句)-即O(1)。

C#(與許多其他語(yǔ)言不同)也允許打開字符串常量-這有點(diǎn)不同。顯然,為任意長(zhǎng)度的字符串構(gòu)建跳轉(zhuǎn)表是不實(shí)際的,因此這類開關(guān)通常會(huì)被編譯到IFS堆棧中。

但是,如果條件的數(shù)量足夠大,足以覆蓋開銷,C#編譯器將創(chuàng)建一個(gè)HashTable對(duì)象,用字符串常量填充它,然后對(duì)該表進(jìn)行查找,然后進(jìn)行跳轉(zhuǎn)。Hashtable查找不是嚴(yán)格意義上的O(1),并且具有明顯的恒定成本,但是如果大小寫標(biāo)簽的數(shù)量很大,它將比IFS中的每個(gè)字符串常量要快得多。

總之,如果條件數(shù)超過5,則更傾向于切換if,否則使用任何看起來(lái)更好的。


查看完整回答
反對(duì) 回復(fù) 2019-07-01
?
四季花海

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

通常(考慮所有語(yǔ)言和所有編譯器),開關(guān)語(yǔ)句有時(shí)比if/etc語(yǔ)句更有效,因?yàn)榫幾g器很容易從Switch語(yǔ)句生成跳轉(zhuǎn)表。在適當(dāng)?shù)募s束條件下,可以對(duì)if/etc語(yǔ)句執(zhí)行同樣的操作,但這要困難得多。

對(duì)于C#,這也是正確的,但出于其他原因。

對(duì)于大量的字符串,使用Switch語(yǔ)句具有顯著的性能優(yōu)勢(shì),因?yàn)榫幾g器將使用哈希表來(lái)實(shí)現(xiàn)跳轉(zhuǎn)。

對(duì)于少量的字符串,兩者之間的性能是相同的。

這是因?yàn)樵谶@種情況下,C#編譯器不生成跳轉(zhuǎn)表。相反,它會(huì)生成相當(dāng)于if/etc塊的msil。

有一個(gè)“Switch語(yǔ)句”msil指令,當(dāng)被拋出時(shí),它將使用一個(gè)跳轉(zhuǎn)表來(lái)實(shí)現(xiàn)一個(gè)Switch語(yǔ)句。但是,它只適用于整數(shù)類型(這個(gè)問題詢問字符串)。

對(duì)于少量的字符串,編譯器生成if/etc塊的效率更高,然后使用哈希表。

當(dāng)我最初注意到這一點(diǎn)時(shí),我假設(shè)因?yàn)閕f/etc塊與少量字符串一起使用,所以編譯器對(duì)大量字符串進(jìn)行了相同的轉(zhuǎn)換。

這是不對(duì)的。“IMA”很好地向我指出了這一點(diǎn)(嗯.他對(duì)此并不友善,但他是對(duì)的,而我錯(cuò)了,這是最重要的部分)

我還對(duì)msil中缺少“開關(guān)”指令做了一個(gè)愚蠢的假設(shè)(我想,如果有一個(gè)開關(guān)原語(yǔ),他們?yōu)槭裁床粚⑺c哈希表一起使用,所以必須沒有開關(guān)原語(yǔ).)。這兩件事都是錯(cuò)的,對(duì)我來(lái)說(shuō)也是非常愚蠢的?!癐MA”再次向我指出了這一點(diǎn)。

我在這里做了更新,因?yàn)樗窃u(píng)分最高的帖子,也是公認(rèn)的答案。

然而,我把它變成了CommunityWiki,因?yàn)槲矣X得我不應(yīng)該因?yàn)殄e(cuò)誤而得到代表。如果你有機(jī)會(huì),請(qǐng)投“IMA”一票。


查看完整回答
反對(duì) 回復(fù) 2019-07-01
?
qq_花開花謝_0

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

選擇switch:

  • 針對(duì)本機(jī)代碼的編譯器通常可以將開關(guān)語(yǔ)句編譯為一個(gè)有條件的分支加上一個(gè)間接跳轉(zhuǎn)鑒于ifS需要一個(gè)條件分支序列..根據(jù)案例的密度,已經(jīng)編寫了大量關(guān)于如何高效編譯案例陳述的學(xué)術(shù)論文;有些是從LCC編譯器頁(yè)..(LCC有一個(gè)更創(chuàng)新的開關(guān)編譯器。)

  • 開關(guān)語(yǔ)句是在相互排斥的備選方案中進(jìn)行選擇和開關(guān)語(yǔ)法使此控制流對(duì)程序員更透明。然后是一窩如果-然后-否則的語(yǔ)句。

  • 在某些語(yǔ)言中,包括絕對(duì)ML和Haskell,編譯器檢查是否遺漏了任何情況。..我認(rèn)為這個(gè)特性是ML和Haskell的主要優(yōu)勢(shì)之一。我不知道C#能不能這么做。

一件軼事:在他獲得終身成就獎(jiǎng)的演講中,我聽到托尼·霍爾說(shuō),在他職業(yè)生涯中所做的所有事情中,有三件是他最自豪的:

  • 發(fā)明快速排序
  • 發(fā)明開關(guān)語(yǔ)句(托尼稱之為

    case

    聲明)
  • 開始和結(jié)束他的工業(yè)生涯

無(wú)法想象沒有switch.


查看完整回答
反對(duì) 回復(fù) 2019-07-01
  • 3 回答
  • 0 關(guān)注
  • 745 瀏覽

添加回答

舉報(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)