在 .Net 中,您可以在“调试”或“发布”设置下专门编译您的项目,发布有更多的优化。我知道这在 Java 中被认为是不必要的,因为抖动会进行这些优化。差异的原因是什么? (意思是,为什么需要/有帮助的预“抖动”编译)
为什么它在 .Net/CLR 中被认为是必需的,但在 Java/JDK 中却不是?
最佳答案
早期的 Java 编译器有一个 -O 标志来启用(源代码)编译优化。从 JDK 1.2 开始,-O 标志就没有作用了,我相信这个标志在 JDK 1.4 中被移除了。随着 Java 运行时的改进,将优化委托(delegate)给 JRE 可能变得越来越合理,因为源代码编译器完全不了解最终将执行代码的硬件。
类似 this one 的文章和 documentation of the csc /optimize flag表明优化对 CLR 代码的实际生成影响很小(如果有的话?)。然而,/optimize 标志确实在编译的程序集中设置了一个标志,该标志控制运行时允许应用的优化级别。我没有尝试过,但我读到运行时优化代码不一定是可调试的,尽管包含调试信息(可以为 C# 编译器独立启用或禁用/optimize 和/debug 标志)。
我真的不明白在编译时控制运行时优化级别的意义。 Java 运行时有多个 detailed options控制运行时性能和优化,但这些必须在启动 JRE 时而不是在编译时定义。
关于.net - 为什么有针对 .Net 的调试和发布版本,但没有针对 Java 的版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4734454/