在.Net中,您可以在「調試」或「發佈」設置下專門編譯項目,Release具有更多優化。我知道這在Java中被認爲是不必要的,因爲抖動會進行這些優化。差異的原因是什麼? (這意味着,爲什麼需要預先「抖動」編譯/幫助)爲什麼Debug&Release爲.Net構建,但不適用於Java?
爲什麼它在.Net/CLR中被認爲是必需的,但在Java/JDK中卻不是這樣?
在.Net中,您可以在「調試」或「發佈」設置下專門編譯項目,Release具有更多優化。我知道這在Java中被認爲是不必要的,因爲抖動會進行這些優化。差異的原因是什麼? (這意味着,爲什麼需要預先「抖動」編譯/幫助)爲什麼Debug&Release爲.Net構建,但不適用於Java?
爲什麼它在.Net/CLR中被認爲是必需的,但在Java/JDK中卻不是這樣?
我認爲他們可以很容易地在Java中引入。基本上調試構建意味着:包含調試符號並禁用優化。發佈反之亦然。調試和發佈目標由Visual Studio生成,不是強制性的。你可以編寫你的MSBuild腳本而不需要VS.因此,您可以使用調試和發佈目標爲Java創建構建腳本。
早期的Java編譯器有一個-O標誌來啓用(源代碼)編譯優化。從JDK 1.2開始,-O標誌沒有效果,我相信JDK 1.4刪除了這個標誌。隨着Java運行時間的改進,將優化委託給JRE可能變得越來越合理,因爲源代碼編譯器完全不瞭解硬件,最終將執行代碼。
像this one和documentation of the csc /optimize flag這樣的文章表明,對CLR代碼的實際生成,優化的影響很小(如果有的話)。然而,/ optimize標誌確實在編譯後的程序集中設置了一個標誌,該標誌控制了允許運行時應用的優化級別。我沒有嘗試過,但是我已經讀過運行時優化後的代碼不一定是可調試的,儘管包含了調試信息(可以爲C#編譯器獨立啓用或禁用/ optimize和/ debug標誌)
Ι在編譯時並沒有真正看到控制運行時優化級別的問題,Java運行時有幾個detailed options來控制運行時性能和最優化,但是這些必須在啓動JRE時定義,而不是在編譯時定義。
Sun的javac
編譯器確實具有調試信息的概念,它可以(可選地)從編譯類輸出中省略。
看the documentation,並檢查了-g
標誌選項:
-g
Generate all debugging information, including local
variables. By default, only line number and source
file information is generated.
-g:none
Do not generate any debugging information.
-g:{keyword list}
Generate only some kinds of debugging information,
specified by a comma separated list of keywords.
Valid keywords are:
source
Source file debugging information
lines
Line number debugging information
vars
Local variable debugging information
這些也許不是很廣泛的字節碼的優化的編譯器.NET可能執行(這我不熟悉,不好意思) ,但我認爲理論上它們出於性能原因(較小的類文件等)。
在實踐中,我強烈懷疑他們不會對現代硬件+ JVM上的運行時性能產生太大影響,但它們在那裏。
http://blogs.msdn.com/b/ericlippert/archive/2009/06/11/what-does-the-optimize-switch-do.aspx有一個很好的優化列表,當優化開關打開時(對於發佈,關閉進行調試)。
Java編譯器也可以執行其中的任何操作,而且默認情況下它可能會執行其中的一些操作。他們大多是小勝。
Weeeeell,他們在.net中做了什麼? – 2011-01-19 11:02:21
相關:http://stackoverflow.com/questions/1313922/step-through-jdk-source-code-in-intellij-idea – finnw 2011-01-19 11:05:31