我的理解是,如果沒有與JLS相矛盾的可觀察效果,則優化是有效的。因此,例如,JIT編譯器可以優化內部循環中的「不做」代碼。Java規範 - 什麼是「有效」優化的規則
但我不記得這個效果的明確聲明。
有沒有人知道Java優化(例如由本地代碼編譯器執行的)是否有效的權威聲明(即在JLS或具有類似聲譽的文檔中)?
我的理解是,如果沒有與JLS相矛盾的可觀察效果,則優化是有效的。因此,例如,JIT編譯器可以優化內部循環中的「不做」代碼。Java規範 - 什麼是「有效」優化的規則
但我不記得這個效果的明確聲明。
有沒有人知道Java優化(例如由本地代碼編譯器執行的)是否有效的權威聲明(即在JLS或具有類似聲譽的文檔中)?
JLS和JVM規範都指定了任何Java語句的行爲(或者對於JVM規範字節碼是如何工作的等),但是他們沒有提及如何該行爲發生。在兩個文檔中隱含的是,任何能夠正確實現指定的抽象行爲的實現都被認爲是一個兼容的Java實現。擁有抽象標準背後的主要思想是指定必須在所有實現中共享的可觀察行爲,而不涉及導致這些行爲發生的細節。出於這個原因,只要不偏離指定的語義,實現和它們的優化器就可以做任何他們覺得有必要和適當的代碼運行。
希望這會有所幫助!
是的...但是你能指出什麼地方談論可觀察到的行爲,並說什麼是什麼,什麼是不可觀察的? (我的直覺是,這是採取的方法......但我想要一些明確的確認。) – 2011-03-20 13:45:59
只要不使代碼與標準行爲不同,編譯器優化就是有效的。這適用於所有語言。
我不認爲有必要特別說明這一事實,因爲符合標準的編譯器的唯一要求是它的行爲與標準描述相同。無論是否符合標準,優化都不會改變其明顯的行爲。
也許有。例如,積極優化循環(完全刪除它們)對於編寫天真基準的人來說是「可觀察的」。如果您可以指出明確指出此類優化是「有效」的規格,那將是非常好的。 (我認爲他們*應該是* ...) – 2011-03-20 13:50:42
@Stephen C:優化可以很好地觀察到(如果它們沒有*,它們將毫無意義),但是我很確定規範沒有對事物的執行時間說很多。只要優化不會改變規範規定的任何內容(執行速度是我希望不會執行的),但它們在遵守標準方面沒有任何區別。 – 2011-03-20 15:58:46
@Stephen C:只要觀察到的行爲(即程序結果)是正確的,一切都很好,規範對速度絕對不感興趣。此外,優化器可以執行任何不會改變單個線程化程序的執行的任何事情,例如,觀察到一個循環變量只讀不寫,因此用while替換循環(true) - 這會導致在其他線程中設置變量的程序出現問題(顯然只有當變量不是易失性的時候) – Voo 2011-03-20 18:25:22
例如,這裏提到的String pool是一種優化形式。對於Integer和Long的小值,類似的概念存在afaik。
也許你會發現更多interesting answers here和這裏的Integer pool的解釋。
通常,單線程場景很簡單。多線程是煩人的,因爲可以觀察到一些優化,特別是對存儲器讀/寫的重新排序。哪種重新排序取決於內存模型,但我不知道java標準指定的內存模型。 – CodesInChaos 2011-03-20 09:59:23
當然,例如:'code_statement; //「有效」優化。 – Margus 2011-03-20 10:25:45
@CodeInChaos - 實際上,對讀/寫的重新排序是明確指定規則的區域。 – 2011-03-20 13:46:37