在.Net中,您可以在“调试”或“发布”设置下专门编译项目,发布具有更多优化。我知道这在Java中被认为是不必要的,因为抖动会进行这些优化。差异的原因是什么? (意思是,为什么需要预先“抖动”编译/有用)
为什么认为有必要在.Net / CLR中,而不是在Java / JDK中?
答案 0 :(得分:4)
早期的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时定义,而不是在编译时定义。
答案 1 :(得分: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上的运行时性能没有太大影响,但它们就在那里。
答案 2 :(得分:3)
我认为它们很容易用Java引入。基本上,Debug构建意味着:包含调试符号并禁用优化。发布则反之亦然。调试和发布目标由Visual Studio生成,不是必需的。您可以在没有VS的情况下编写MSBuild脚本。因此,您可以使用Debug和Release目标为Java创建构建脚本。
答案 3 :(得分:0)
http://blogs.msdn.com/b/ericlippert/archive/2009/06/11/what-does-the-optimize-switch-do.aspx有一个很好的优化列表,当优化开关打开时它会被执行(它是打开的,关闭用于调试)。
Java编译器也可以执行其中的任何操作,并且默认情况下它可以执行其中一些操作。他们大多是小胜利。