4 回答

TA貢獻(xiàn)2011條經(jīng)驗(yàn) 獲得超2個(gè)贊
這是一個(gè)略微的簡(jiǎn)化,因?yàn)橥ǔH魏维F(xiàn)代編譯器遇到的if..else if ..序列都可能被人輕易地轉(zhuǎn)換為switch語(yǔ)句,編譯器也將如此。但是只是為了增加樂(lè)趣,編譯器不受語(yǔ)法的限制,因此可以在內(nèi)部生成“ switch”之類(lèi)的語(yǔ)句,這些語(yǔ)句混合了范圍,單個(gè)目標(biāo)等,并且它們可以(也可以)對(duì)switch和if做到這一點(diǎn)。 .else語(yǔ)句。
順便說(shuō)一句,Konrad答案的擴(kuò)展是編譯器可以生成一個(gè)跳轉(zhuǎn)表,但這不一定能保證(也不可?。?。出于各種原因,跳轉(zhuǎn)表對(duì)現(xiàn)代處理器上的分支預(yù)測(cè)器不利,而表本身對(duì)緩存行為不利。
switch(a) { case 0: ...; break; case 1: ...; break; }
如果編譯器為此實(shí)際生成了一個(gè)跳轉(zhuǎn)表,則if..else if..由于跳轉(zhuǎn)表使分支預(yù)測(cè)失敗,因此替代樣式代碼的運(yùn)行速度可能會(huì)更慢。

TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超4個(gè)贊
Switch / case語(yǔ)句通??梢愿斓剡_(dá)到1級(jí)深度,但是當(dāng)您開(kāi)始使用2級(jí)或2級(jí)以上語(yǔ)句時(shí),switch / case語(yǔ)句的開(kāi)始時(shí)間是嵌套if / else語(yǔ)句的2-3倍。
本文有一些速度比較,突出顯示了嵌套此類(lèi)語(yǔ)句時(shí)的速度差異。
例如,根據(jù)他們的測(cè)試,示例代碼如下:
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語(yǔ)句運(yùn)行一半的時(shí)間內(nèi)完成了:
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;
}
是的,這是一個(gè)基本的例子,但它說(shuō)明了這一點(diǎn)。
因此,對(duì)于僅深一層的簡(jiǎn)單類(lèi)型,可能會(huì)使用switch / case來(lái)得出結(jié)論,但對(duì)于更復(fù)雜的比較和多個(gè)嵌套的層,則使用經(jīng)典的if / else構(gòu)造?

TA貢獻(xiàn)1886條經(jīng)驗(yàn) 獲得超2個(gè)贊
不匹配的統(tǒng)計(jì)信息可能不好。
如果您實(shí)際下載源,則在if和switch情況下,不匹配值都已知為21。編譯器應(yīng)該能夠抽象出來(lái),知道應(yīng)該始終運(yùn)行哪個(gè)語(yǔ)句,并且CPU應(yīng)該能夠正確分支預(yù)測(cè)。
在我看來(lái),更有趣的情況是并非所有情況都中斷了,但是這可能不是實(shí)驗(yàn)的范圍。
- 4 回答
- 0 關(guān)注
- 750 瀏覽
添加回答
舉報(bào)