.net - 为什么有针对 .Net 的调试和发布版本,但没有针对 Java 的版本?

标签 .net clr java

在 .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/

相关文章:

java - 最佳实践 - Collection.add() 和处理 boolean 返回值

c# - 任务并行库 - LongRunning 任务与多个 Continuations

clr - Oracle Data Provider 到 CLR 类型映射

c# - 相同的代码在不同的机器上表现不同 - 可能是什么原因? (CLR 版本问题?)

.net - 已签名的 .net 程序集在加载时是否经过全面验证,以检查它们是否未被修改?

java - 使用堆栈进行质因数分解

java - 将类似 JavaScript 的语法解析为我自己的 Java 方法

.net - F# - 将 100 个对象创建到一个列表中 - 最实用和惯用的方式

c# - 如何找到RichTextBox 的.Handle?

c# - 如何指示单行 C# winforms 文本框中有更多文本?