簡體   English   中英

是否會在編譯時優化局部變量的一次性使用?

[英]Will one-time usages of local variables be optimized at compile time?

double calcTaxAmount() {
    double price = getA() * getB() + getC();
    double taxRate = getD() + getE();
    return price * taxRate;
}

上述功能計算納稅金額。

通過調用其他一些功能來計算價格和費率。

我介紹了兩個局部變量price和taxRate來提高代碼的可讀性,因此兩者都只使用一次。 在大多數現代編譯器的編譯時,這些“一次性”局部變量是否會被替換和內聯?

一般是的。

Java只會在多次調用代碼后將代碼優化為本機代碼(默認情況下為10,000次)如果該方法不是非常多的調用,則無論如何都不會產生太大的影響。

即使每個產生1 ns的差異,您也需要調用此方法10億次以添加2秒的延遲。 如果它只有1000萬次你不太可能注意到差異。

顯然,這取決於編譯器。 在優化方面,相當多的編譯器實際上是腦死亡,因為它們處理的動態語言足夠復雜,大多數優化都是無效的,而且許多其他編譯器只有在滿足非常嚴格的條件時才是安全的(例如,任何函數調用)可能幾乎有任何影響)。 例如,所有Python實現都具有編譯器,但大多數只執行很少的窺孔優化,這可能不足以消除所有開銷。

也就是說,如果你在談論靜態類型語言(你的例子暗示),那么通常是的。 活動分析可以檢測等效性(您仍然需要存儲位置,但生命周期是相同的),任何合理的寄存器分配器都可以避免不必要地溢出值。

也就是說,這是一個非常糟糕的優化重點。 如果您確實想要更快地制作內容,請查看最終代碼和配置文件以及實際場景。 如果您要進行微觀優化,請運用一些常識。 即使假設此功能是一個熱點,實際計算和獲取值可能很容易花費100倍的時間。 與堆棧存儲相比,非內聯函數調用需要相當長的時間,並且在此級別上緩存未命中也是相當大的成本。

只要編譯器可以證明它們沒有別名和外部修改,編譯器應該能夠優化它們(我懷疑它可以在這里確定)。

如果你使它們成為const我就不會想到一個無法優化它的編譯器。

所有這一切,這聽起來像是過早的優化,即使它的速度稍慢,我也不會改變代碼,因為它增加了清晰度。

完全取決於C的編譯器。對於打開了適當優化選項的當前編譯器,可能是肯定的。

對於Java,它不會編譯器 (javac)優化,但是當代碼實際執行時,它可能會被JIT優化。

有人說,這些局部變量無論如何都會增加很少的開銷。 如果編譯器決定將表達式優化為等效於:

 return (getA() * getB() + getC()) * (getD() + getE());

它仍然需要某種形式的臨時存儲(堆棧或寄存器)來存儲子表達式的中間結果。 所以它無論如何都不應該有太大的不同。

我不擔心它,並提供更好的可讀性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM