在 Scala 中 immutable Vector code有一条评论说:
In principle, most members should be private. However, access privileges must be carefully chosen to not prevent method inlining
- private 对内联决策有何影响?
- 这也适用于 Java 吗?
最佳答案
这通常不适用于 Java。访问检查在 Resolution 期间仅执行一次过程。当 Java 方法被 JIT 编译时,符号引用已经被解析和验证。事实上,内联不是在原始字节码上执行的,而是在特定于编译器的中间表示上执行的。因此,访问修饰符通常不会产生性能副作用。
但是,我可以编写一个人工测试用例,其中 private
/public
修饰符会显着影响性能:
public class Test {
static final Inner inner = new Inner();
static class Inner {
int x = 1;
int getX1() { return x; }
int getX2() { return getX1(); }
int getX3() { return getX2(); }
int getX4() { return getX3(); }
int getX5() { return getX4(); }
int getX6() { return getX5(); }
int getX7() { return getX6(); }
int getX8() { return getX7(); }
int getX9() { return getX8(); }
private int getPrivate() { return getX9(); }
public int getPublic() { return getX9(); }
}
@GenerateMicroBenchmark
public int inlinePrivate() {
return inner.getPrivate();
}
@GenerateMicroBenchmark
public int inlinePublic() {
return inner.getPublic();
}
}
Benchmark Mode Thr Cnt Sec Mean Mean error Units
b.Test.inlinePrivate thrpt 1 3 5 289480,928 2247,656 ops/msec
b.Test.inlinePublic thrpt 1 3 5 1157970,245 18473,139 ops/msec
此效果由合成方法 access$000
解释,javac
生成该方法以允许访问内部类的私有(private)成员。在上面的测试用例中,这个额外的访问器阻止了内联,因为 HotSpot 中默认的最大内联级别是 9 (-XX:MaxInlineLevel=9
)。由于 getPrivate()
不能直接从外部类调用,额外的 access$000()
方法进行第 10 级调用,因此不是内联的。
关于java - 私有(private)方法内联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23268120/