問(wèn)題:這更多是出于好奇心而不是其他任何事情.如果我有一個(gè)Java if / else語(yǔ)句,并且我知道’if / else’語(yǔ)句的一個(gè)分支將比另一個(gè)分支更頻繁地使用,那么我訂購(gòu)這兩個(gè)分支的方式是否提供了一個(gè)提示JIT編譯器可以帶來(lái)更好的性能嗎?
背景:
在我簡(jiǎn)單的計(jì)算機(jī)體系結(jié)構(gòu)視圖中,“if / else”語(yǔ)句被轉(zhuǎn)換為一個(gè)條件跳轉(zhuǎn)指令,后跟在沒(méi)有執(zhí)行跳轉(zhuǎn)時(shí)應(yīng)該執(zhí)行的指令.內(nèi)存中的其他位置將是跳轉(zhuǎn)所針對(duì)的代碼.據(jù)我了解,CPU會(huì)按順序加載指令(我確定我在這里忽略了分支預(yù)測(cè)器),并且非跳轉(zhuǎn)路徑有更高的機(jī)會(huì)被加載到指令緩存和CPU中指令管道.
問(wèn)題重述:if / else語(yǔ)句的分支的合理排序是否會(huì)增加經(jīng)常執(zhí)行的代碼緊跟條件跳轉(zhuǎn)指令的可能性,這將使代碼對(duì)緩存和管道更友好?
現(xiàn)實(shí):聽(tīng)到JIT編譯器是如此復(fù)雜的軟件,在完成所有指令重新排序,寄存器分配和其他簿記后,我不會(huì)感到驚訝,它無(wú)法做出這樣的保證.
我的大多數(shù)’if / else’語(yǔ)句都會(huì)被取消執(zhí)行,所以我不會(huì)到處都這樣做.此外,很多時(shí)候我會(huì)猜錯(cuò)哪個(gè)分支將更頻繁地執(zhí)行并最終實(shí)際上損害性能.
我想這樣一個(gè)簡(jiǎn)單的事情,如故意用分支排序不會(huì)被認(rèn)為是過(guò)早的優(yōu)化,但如果是,我只會(huì)弄亂訂單,如果一個(gè)分析器告訴我代碼很慢.
謝謝!
解決方法:
沒(méi)有.
你不能.你不需要.
它對(duì)編譯器有一定意義,因?yàn)樗梢苑g
if (improbable) { doSomething();} else { doSomethingElse();}doMoreThings();return;
進(jìn)入(偽代碼)
if (improbable) goto awaydoSomething()back: doMoreThings()returnaway: doSomethingElse()goto back
這樣就可以簡(jiǎn)化更可能的路徑. AOT編譯器可以依賴提供的信息.
你不需要.但是收集統(tǒng)計(jì)信息之后,Java JIT編譯器就會(huì)這樣做.在這里,javac是無(wú)關(guān)緊要的,因?yàn)樽止?jié)碼被解釋器執(zhí)行了幾次,這很慢,但對(duì)于很少執(zhí)行的部分和足以收集統(tǒng)計(jì)信息的部分來(lái)說(shuō)已經(jīng)足夠了.通常,這些統(tǒng)計(jì)數(shù)據(jù)優(yōu)于程序員可能提供的數(shù)據(jù),但更重要的是:它們會(huì)針對(duì)每個(gè)與時(shí)間相關(guān)的代碼進(jìn)行收集.它實(shí)際上更復(fù)雜,因?yàn)槟抢镉蠧1和C2編譯器……
你不能.在字節(jié)碼中沒(méi)有標(biāo)準(zhǔn)化的表達(dá)方式.此外,優(yōu)化器會(huì)在內(nèi)部表示中轉(zhuǎn)換代碼,這些細(xì)節(jié)會(huì)丟失.
過(guò)早優(yōu)化忘了它.編譯器可以很好地完成更復(fù)雜的事情.一些低級(jí)優(yōu)化仍然有意義,但僅限于非常極端的情況.如果需要,可以使用干凈的代碼并進(jìn)行一些高級(jí)優(yōu)化.
來(lái)源:https://www.icode9.com/content-1-275101.html聯(lián)系客服