我对VM在运行时和编译时进行优化感兴趣。我认为优化在编译时是最有效和最简单的。
然而,在某些情况下,我的想法似乎是错误的。这在Steve Yeggie's statement quoted by Daniel
中很明显[O]在运行时由聪明人执行时,优化通常更容易 虚拟机 - - 。
为什么VM在运行时在运行时比在编译时更容易进行优化?
答案 0 :(得分:4)
简答:因为在运行时更容易识别和分析热点 - 程序中使用时间最长的部分。
答案很长:
如果您开始在解释模式下运行代码,虚拟机可以计算代码的不同部分的使用频率和时长。这些部件可以更好地进行优化。
采用嵌套的if-then-else子句。较少的布尔检查需要较少的运行时间。如果优化部件的路径(经常执行),则可以获得更好的整体运行时间。
另一点是,在运行时,您可以进行假设,这在编译时是不可能的。例如,Java-VM在服务器模式虚拟方法中内联 - 只要加载一个类,就可以实现这些方法。如果在编译时完成,那将是不安全的。如果加载了另一个类,JVM会再次优化代码,但通常不会发生这种情况。
此外,在运行时对程序运行的机器更加了解。如果你有一台带有更多寄存器的机器,你可以使用它们。同样,如果在编译时完成,这是不安全的。
有一点要说:在运行时优化也有缺点。最重要的是:优化的时间被添加到程序的运行时。它也更复杂,因为你必须编译程序的一部分并执行它们。虚拟机中的错误至关重要。考虑一下编译器,有时会崩溃 - 你可以再次编译,一切都很好。如果VM有时崩溃,这意味着您的程序有时会崩溃。不好。
作为结论:您可以在运行时进行所有优化,这可以在编译时进行......等等。您有关于程序,执行路径和程序运行的机器的更多信息。但是您必须考虑运行优化所需的时间。此外,它在运行时更复杂,故障比编译时更复杂。
答案 1 :(得分:2)
因为在运行时可以获得更多信息。例如,已知精确的CPU,操作系统和其他环境细节。此信息会影响优化的完成方式。
答案 2 :(得分:2)
VM具有该程序的完整代码,并且由于不同翻译单元的单独翻译,编译器通常仅具有部分代码。因此,VM有更多数据可供分析。
答案 3 :(得分:1)
因为在运行时你有额外的信息:机器的运行方式,进程的内存限制,可能最重要的是,正在执行的代码和频率。
这些东西允许您进行运行时优化,而这些优化是您在编译时无法进行的。
答案 4 :(得分:1)
VM可以收集统计信息以进行优化,同样数据库会对您的使用情况进行处理。
答案 5 :(得分:1)
持续保持统计信息和检查不变量也是编译或解释片段执行时间的开销。如果你不能快速和足够优化,请不要打扰。我认为在运行时而不是编译时获得更好的结果并不容易。考虑到良好实施的复杂性,我认为这更难。
就像普遍存在的错误概念一样,优秀的编译器能够产生比人类更好的装配,因此足够聪明的虚拟机可能需要太聪明才能更快地执行。
答案 6 :(得分:0)
需要认识到的是,虚拟机不是允许运行时优化的概念,而是许多虚拟机不会丢弃原始程序元数据并具有内置的反射功能。一个更合适的术语是“运行时库”可以比单独的静态优化做更好的优化;这适用于非VM语言,如C。