2011-01-19 31 views
7

在.Net中,您可以在「調試」或「發佈」設置下專門編譯項目,Release具有更多優化。我知道這在Java中被認爲是不必要的,因爲抖動會進行這些優化。差異的原因是什麼? (這意味着,爲什麼需要預先「抖動」編譯/幫助)爲什麼Debug&Release爲.Net構建,但不適用於Java?

爲什麼它在.Net/CLR中被認爲是必需的,但在Java/JDK中卻不是這樣?

+1

Weeeeell,他們在.net中做了什麼? – 2011-01-19 11:02:21

+0

相關:http://stackoverflow.com/questions/1313922/step-through-jdk-source-code-in-intellij-idea – finnw 2011-01-19 11:05:31

回答

3

我認爲他們可以很容易地在Java中引入。基本上調試構建意味着:包含調試符號並禁用優化。發佈反之亦然。調試和發佈目標由Visual Studio生成,不是強制性的。你可以編寫你的MSBuild腳本而不需要VS.因此,您可以使用調試和發佈目標爲Java創建構建腳本。

4

早期的Java編譯器有一個-O標誌來啓用(源代碼)編譯優化。從JDK 1.2開始,-O標誌沒有效果,我相信JDK 1.4刪除了這個標誌。隨着Java運行時間的改進,將優化委託給JRE可能變得越來越合理,因爲源代碼編譯器完全不瞭解硬件,最終將執行代碼。

this onedocumentation of the csc /optimize flag這樣的文章表明,對CLR代碼的實際生成,優化的影響很小(如果有的話)。然而,/ optimize標誌確實在編譯後的程序集中設置了一個標誌,該標誌控制了允許運行時應用的優化級別。我沒有嘗試過,但是我已經讀過運行時優化後的代碼不一定是可調試的,儘管包含了調試信息(可以爲C#編譯器獨立啓用或禁用/ optimize和/ debug標誌)

Ι在編譯時並沒有真正看到控制運行時優化級別的問題,Java運行時有幾個detailed options來控制運行時性能和最優化,但是這些必須在啓動JRE時定義,而不是在編譯時定義。

4

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上的運行時性能產生太大影響,但它們在那裏。

相關問題