3 回答

TA貢獻(xiàn)1834條經(jīng)驗 獲得超8個贊
方法襯里。將方法調(diào)用替換為注入該方法的代碼。這是一個很大的問題,它使屬性訪問器基本上是免費的。 CPU寄存器分配。局部變量和方法參數(shù)可以保存在CPU寄存器中,而不會(或不太頻繁)存儲回堆棧幀。這是一個很大的問題,因為它使得調(diào)試優(yōu)化代碼變得如此困難。并給出 易揮發(fā)關(guān)鍵字的意思。 數(shù)組索引檢查消除。處理數(shù)組時的一個重要優(yōu)化(所有.NET集合類都在內(nèi)部使用數(shù)組)。當(dāng)JIT編譯器可以驗證一個循環(huán)從不索引超出界限的數(shù)組時,它將消除索引檢查。大的。 循環(huán)展開。通過在主體中重復(fù)代碼4次并減少循環(huán),可以改進(jìn)具有小體的循環(huán)。降低了分支成本,并改進(jìn)了處理器的超標(biāo)量執(zhí)行選項。 死代碼消除。如if(False){/ .../}被完全淘汰。這可能是由于不斷的折疊和內(nèi)襯。其他情況是JIT編譯器可以確定代碼沒有可能產(chǎn)生副作用。這種優(yōu)化使得分析代碼變得如此棘手。 代碼提升。循環(huán)中不受循環(huán)影響的代碼可以從循環(huán)中移出。C編譯器的優(yōu)化器將花費更多的時間來尋找提升的機(jī)會。然而,這是一個昂貴的優(yōu)化,因為需要的數(shù)據(jù)流分析和抖動無法負(fù)擔(dān)的時間,所以只有提升明顯的情況。迫使.NET程序員編寫更好的源代碼并提升自己。 常見的子表達(dá)式消除。x=y+4;z=y+4;變成z=x;在語句中非常常見,如DEST[ix+1]=src[ix+1];為可讀性而編寫,而不引入輔助變量。不需要妥協(xié)可讀性。 不斷折疊。x=1+2;變成x=3;這個簡單的示例被編譯器提前捕獲,但在JIT時發(fā)生,而其他優(yōu)化使得這成為可能。 復(fù)制傳播。x=a;y=x;變成y=a;這有助于寄存器分配器做出更好的決定。這在x86抖動中是一個很大的問題,因為它幾乎沒有什么寄存器可以使用。讓它選擇正確的選擇是Perf的關(guān)鍵。

TA貢獻(xiàn)1757條經(jīng)驗 獲得超7個贊
是的,有許多性能差異,這些都適用于您的代碼。調(diào)試很少進(jìn)行性能優(yōu)化,并且發(fā)布模式非常多; 只有依賴于 DEBUG
常數(shù)在發(fā)行版構(gòu)建中可能執(zhí)行不同的操作。除此之外,你不應(yīng)該看到任何問題。
DEBUG
Debug.Assert()
[Conditional("DEBUG)"]
DEBUG

TA貢獻(xiàn)1830條經(jīng)驗 獲得超9個贊
- 3 回答
- 0 關(guān)注
- 620 瀏覽
添加回答
舉報