我想你是在比较苹果和橘子。Performance Myths 参考讨论了 JIT 对于字段访问的优势,而第二个参考讨论了 JIT 对于方法访问的优势。
据我了解,直接字段访问与本地访问(不是您在帖子中所写的本地字段访问 - 没有本地字段之类的东西)的类比如下:
class foo {
int bar = 42;
int doStuff(){
int x = 1;
x += bar;
x += bar;
x += bar;
return x;
}
}
每个对 的引用bar
都有相关的性能成本。一个好的编译器会认识到优化的机会并像这样“重写”代码:
int doStuff(){
int x = 1f;
int local_bar = bar;
x += local_bar;
x += local_bar;
x += local_bar;
return x;
}
如果没有 JIT,这是一个方便的优化,可以让您的性能提高20%。
使用 JIT,优化是不必要的,因为 JIT 首先消除了访问对性能的影响bar
。
第二个参考描述了以下场景:
class foo {
int bar = 42;
int getBar() { return bar; }
int doStuff(){
int x = 1;
x += getBar();
x += getBar();
x += getBar();
return x;
}
}
每个函数调用都有相关的性能损失。编译器不能缓存多个getBar()
方法调用(因为它在前面的示例中缓存了多个直接字段访问bar
),因为 getBar() 可能在每次调用时返回一个完全不同的数字(即,如果它有一个随机或时间-基于组件的返回值)。因此,它必须执行三个方法调用。
了解上述函数在有或没有 JIT 的情况下将以大致相同的速度执行是至关重要的。
If you were to manually replace getBar()
in the above function with simply bar
, you would achieve a performance boost. On a machine without a JIT, that performance boost is roughly 3x, because field access is still somewhat slow, so replacing the very slow methods with somewhat slow field accesses only yields a moderate boost. With a JIT, however, field access is fast, so replacing the very slow methods with fast field access yields a much greater (7x) boost.
I hope that makes sense!