4

我对虚拟机在运行时和编译时的优化感兴趣。我的想法是优化在编译时是最有效和最简单的。

但是,在某些情况下,我的想法似乎是错误的。这在丹尼尔引用的史蒂夫耶吉的声明中很明显

[O] 由聪明的虚拟机在运行时执行优化通常更容易 - -。

为什么在运行时由 VM 执行的优化比在编译时更容易?

4

7 回答 7

4

简短的回答:因为在运行时更容易识别和分析热点 - 程序中使用时间最多的部分。

长答案:

如果您开始在解释模式下运行代码,虚拟机可以计算代码不同部分的使用频率和使用时间。这些部分可以更好地优化。

采用嵌套的 if-then-else-clauses。更少的布尔检查需要更少的运行时间。如果您优化零件的路径,即更频繁地执行,您可以获得更好的整体运行时间。

另一点是,在运行时您可以做出假设,而这在编译时是不可能的。例如,Java-VM 在服务器模式虚拟方法中内联——只要只加载一个实现这些方法的类。如果在编译时完成,那将是不安全的。如果加载了另一个类,JVM 会再次取消优化代码,但这通常不会发生。

同样在运行时更了解程序运行的机器。如果您有一台带有更多寄存器的机器,您可以使用它们。同样,如果在编译时完成,那也是不安全的。

有一件事要说:在运行时优化也有缺点。最重要的是:优化的时间被添加到程序的运行时间中。它也更复杂,因为您必须编译部分程序并执行它们。虚拟机中的错误至关重要。想想一个编译器,它有时会崩溃——你可以再次编译,一切都很好。如果虚拟机有时会崩溃,这意味着您的程序有时会崩溃。不好。

作为结论:您可以在运行时进行所有优化,这在编译时是可能的......等等。你有更多关于程序的信息,它的执行路径和程序正在运行的机器。但是您必须考虑运行优化所需的时间。此外,在运行时执行起来更复杂,并且错误比在编译时更相关。

于 2009-06-26T10:36:53.607 回答
2

因为在运行时有更多信息可用。例如,确切的 CPU、操作系统和其他环境细节是已知的。该信息会影响应该如何进行优化。

于 2009-06-26T10:37:40.360 回答
2

虚拟机拥有程序的完整代码,而编译器通常只有部分代码,因为不同翻译单元的单独翻译。因此,VM 有更多数据可供分析。

于 2009-06-26T10:37:48.037 回答
1

因为在运行时你有额外的信息:机器是如何执行的,你的进程的内存限制,可能最重要的是,正在执行什么代码以及执行频率。

这些东西使您可以进行在编译时根本无法进行的运行时优化。

于 2009-06-26T10:37:12.780 回答
1

VM 可以收集统计信息以进行优化,就像数据库对您的使用情况一样。

于 2009-06-26T10:41:47.373 回答
1

持续保持统计数据和检查不变量也会增加编译或解释片段的执行时间。如果您不能快速和足够好地优化,请不要打扰。我认为在运行时而不是编译时获得更好的结果并不容易。我认为考虑到一个好的实现的复杂性更加困难。

就像对足够好的优化编译器生成比人类更好的汇编的普遍误解一样,足够聪明的 VM 可能需要太聪明才能执行得更快。

于 2009-06-26T11:40:29.987 回答
0

需要认识到的是,允许运行时优化的不是 VM 的概念,而是许多 VM 不会丢弃原始程序元数据并具有内置反射功能的事实。一个更合适的术语是“运行时库”可以比单独的静态优化做更好的优化;这适用于 C 等非 VM 语言。

于 2009-06-26T14:48:28.513 回答