我很好奇创建一个java中没有字段的类对象需要多少个cpu周期或时间?我和同事一起讨论是否以独特的方式创建新对象以获取某些内容或创建uuid是个好主意,在他的辩护中,他说如今创建对象在java中非常轻,我也同意。
但问题是它如何与像uuid一代完全不同的东西相比?
因此,怀疑分配对象和协议需要多少CPU周期?涉及的具体步骤是什么?
答案 0 :(得分:7)
Java中的对象创建可能需要从0到数十亿周期。
我已经在this和this回答中对HotSpot JVM中的分配进行了高级概述。
在TLAB中分配对象的最常用方法包括以下步骤:
tlab_top
指针(x64上通常有一个专用的CPU寄存器用于线程本地)。tlab_top + object_size
与tlab_end
进行比较。如果需要,跳转到慢速路径。tlab_top
的新值。前一个值是新创建的对象的地址。klass
字段 - 指向对象类元数据的指针。这些都是大约10-15个CPU指令。
让我们使用JMH基准来衡量对象创建的平均时间。
package bench;
import org.openjdk.jmh.annotations.Benchmark;
public class Alloc {
@Benchmark
public Object baseline() {
return "Some preallocated object";
}
@Benchmark
public Object newObject() {
return new Object();
}
}
结果:
Benchmark Mode Cnt Score Error Units
Alloc.baseline avgt 10 3,428 ± 0,089 ns/op
Alloc.newObject avgt 10 4,505 ± 0,056 ns/op
因此,对象分配以及基准测试开销在2.4GHz CPU上需要大约4.5 ns或大约11个周期。与UUID生成算法相比,这确实很便宜。