4

在谈论“长时间运行”的应用程序时,我听说过很多关于 JIT 编译如何使代码运行得比预编译更快的信息。但是,完全优化您的应用程序需要多长时间?

只是为了兴趣,我将向您展示示例。我有一些方法,我们称之为mySlowMethod()。它每秒执行几百次诸如旋转、乘法等一些矩阵计算。我测量了每次通话的时间并得到了以下结果:

long time = System.nanoTime();
mySlowMethod();
System.out.println(System.nanoTime()-time);

//first call
1577187 (1.6 ms)
//next 2 seconds
~60000 (0.06 ms)
//later 
less than 10000 (0.01 ms)
4

1 回答 1

5

JIT 实际上以多个较小的步骤运行,以最大限度地减少对应用程序启动的性能影响。这些步骤包括:

  1. 多种模式。

    • 基线JIT 编译器用于执行 [相对] 简单的字节码直接转换为机器码,以便立即执行各个方法。
    • 优化编译器用于对多次执行和/或消耗大量计算资源的代码执行许多高级优化。
  2. 增量编译。

    • 虽然 JVM 会预先加载整个模块的字节码,但实际的编译过程通常会延迟到第一次实际执行方法之后。对于大型应用程序(例如 IDE),很明显并非 IDE 的所有功能在应用程序启动时都在使用中,因此这种增量编译能力将 JIT 进程分散到更长的应用程序运行时间,以至于它通常甚至不引人注意。

总体而言,应用程序可能永远不会“完全优化”,但您永远不会知道这一点,因为您真正关心的部分很早就被优化了。

于 2013-06-26T22:30:45.820 回答