自动装箱性能

jel*_*ion 5 java performance autoboxing garbage-collection

为什么组j=k*lm=n*o有不同的表现,而前3组有相同的?

int a = 42;
int b = 42;
int c = 42;

Integer d = 42;
int e = 42;
int f = 42;

int g = 42;
Integer h = 42;
int i = 42;

int j = 42;
int k = 42;
Integer l = 42;

Integer m = 42;
Integer n = 42;
Integer o = 42;

for(int z = 0; z < 1000000000; z++){
    // c = a*b; // 630 ms
    // f = d*e; // 630 ms
    // i = g*h; // 630 ms
    // l = j*k; // 6000 ms
    // o = m*n; // 6400 ms
}
Run Code Online (Sandbox Code Playgroud)

Pet*_*rey 6

你有一个循环没有做任何有用的事情.因此,JIT可能需要一些时间来检测并消除循环.在前四个示例中,代码平均占用一个时钟周期的一小部分.这是一个强有力的暗示,循环已被优化掉,你实际上是在测量无需检测和替换循环所需的时间,

在后面的例子中,循环没有被优化掉,因为JIT没有消除循环.我怀疑它是对象的分配Integer-verbosegc显示没有创建对象.

在我的机器上,循环需要大约1.9 ns或大约6个时钟周期,这非常快,所以我不确定剩下多少时间.