gpt4 book ai didi

java - 私有(private)方法内联

转载 作者:搜寻专家 更新时间:2023-10-31 19:33:19 26 4
gpt4 key购买 nike

在 Scala 中 immutable Vector code有一条评论说:

In principle, most members should be private. However, access privileges must be carefully chosen to not prevent method inlining

  1. private 对内联决策有何影响?
  2. 这也适用于 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com