jel*_*ion 5 java performance autoboxing garbage-collection
为什么组j=k*l和m=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)
你有一个循环没有做任何有用的事情.因此,JIT可能需要一些时间来检测并消除循环.在前四个示例中,代码平均占用一个时钟周期的一小部分.这是一个强有力的暗示,循环已被优化掉,你实际上是在测量无需检测和替换循环所需的时间,
在后面的例子中,循环没有被优化掉,因为JIT没有消除循环.我怀疑它是对象的分配Integer但-verbosegc显示没有创建对象.
在我的机器上,循环需要大约1.9 ns或大约6个时钟周期,这非常快,所以我不确定剩下多少时间.