Điều này thường không áp dụng cho Java. Kiểm tra truy cập chỉ được thực hiện một lần trong quá trình Resolution. Khi phương thức Java được biên dịch JIT, các tham chiếu tượng trưng đã được giải quyết và xác minh. Trong thực tế, nội tuyến được thực hiện không phải trên bytecode ban đầu, nhưng trên đại diện trình biên dịch trung gian cụ thể. Vì vậy, các công cụ sửa đổi truy cập thường không có hiệu ứng phụ.
Tuy nhiên, tôi có thể viết một trường hợp thử nghiệm nhân tạo nơi một modifier private
/public
ảnh hưởng đến hiệu suất đáng kể:
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
Hiệu ứng này được giải thích bởi một phương pháp tổng hợp access$000
mà javac
tạo để cho phép truy cập vào một thành viên riêng của lớp bên trong. Trong trường hợp kiểm tra ở trên, accessor phụ này ngăn cản nội tuyến, vì mức nội tuyến tối đa mặc định trong HotSpot là 9 (-XX:MaxInlineLevel=9
). Vì không thể gọi trực tiếp từ getPrivate()
từ lớp bên ngoài, phương thức access$000()
bổ sung làm cho mức độ gọi thứ 10 và do đó không được gạch chân.