Tôi đã thiếu một số con số cho sự khác biệt về tốc độ. Vì vậy, tôi đã cố gắng chuẩn hóa chúng, điều này hóa ra không dễ dàng như vậy: Vòng lặp Java trở nên chậm hơn sau một số lần chạy / lỗi của JIT?
Cuối cùng tôi đã sử dụng Calibre và kết quả giống như chạy các bài kiểm tra của tôi bằng tay:
Không có sự khác biệt có thể đo lường được cho các cuộc gọi tĩnh / động.Ít nhất là không dành cho Linux / AMD64 / Java7.
Kết quả Caliper ở đây: https://microbenchmarks.appspot.com/runs/1426eac9-36ca-48f0-980f-0106af064e8f#r:scenario.benchmarkSpec.methodName,scenario.vmSpec.options.CMSLargeCoalSurplusPercent,scenario.vm. CMSLargeSplitSurplusPercent, kịch bản.vmSpec.options.CMSSmallCoalSurplusPercent, kịch bản.vmSpec.options.CMSSmallSplitSurplusPercent, kịch bản.vmSpec.options.FLSLargestBlockCoalSurplusPercent, kịch bản.vmSpec.options.CMSSmallSplitSurplusPercent, kịch bản.vmSpec.options.FLSLargestBlockCoalesceProximity, kịch bản.vmSpispec.opcuration
và kết quả của riêng tôi là:
Static: 352 ms
Dynamic: 353 ms
Static: 348 ms
Dynamic: 349 ms
Static: 349 ms
Dynamic: 348 ms
Static: 349 ms
Dynamic: 344 ms
Lớp Kiểm tra Caliper là:
public class TestPerfomanceOfStaticMethodsCaliper extends Benchmark {
public static void main( String [] args ){
CaliperMain.main( TestPerfomanceOfStaticMethodsCaliper.class, args );
}
public int timeAddDynamic( long reps ){
int r=0;
for( int i = 0; i < reps; i++ ) {
r |= addDynamic( 1, i );
}
return r;
}
public int timeAddStatic( long reps ){
int r=0;
for( int i = 0; i < reps; i++ ) {
r |= addStatic( 1, i );
}
return r;
}
public int addDynamic( int a, int b ){
return a+b;
}
private static int addStatic( int a, int b ){
return a+b;
}
}
Và lớp Kiểm tra của riêng tôi là:
public class TestPerformanceOfStaticVsDynamicCalls {
private static final int RUNS = 1_000_000_000;
public static void main( String [] args ) throws Exception{
new TestPerformanceOfStaticVsDynamicCalls().run();
}
private void run(){
int r=0;
long start, end;
for( int loop = 0; loop<10; loop++ ){
// Benchmark
start = System.currentTimeMillis();
for( int i = 0; i < RUNS; i++ ) {
r += addStatic( 1, i );
}
end = System.currentTimeMillis();
System.out.println( "Static: " + ( end - start ) + " ms" );
start = System.currentTimeMillis();
for( int i = 0; i < RUNS; i++ ) {
r += addDynamic( 1, i );
}
end = System.currentTimeMillis();
System.out.println( "Dynamic: " + ( end - start ) + " ms" );
// Do something with r to keep compiler happy
System.out.println( r );
}
}
private int addDynamic( int a, int b ){
return a+b;
}
private static int addStatic( int a, int b ){
return a+b;
}
}