gpt4 book ai didi

algorithm - 在 Java 中创建一个对象需要多少个 CPU 周期?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:30:37 27 4
gpt4 key购买 nike

我很好奇在 java 中创建一个没有字段的类的对象需要多少 cpu 周期或时间?我正在与同事讨论为引用某些东西或创建 uuid 的独特方式创建新对象是否是个好主意,在他的辩护中,他说如今在 java 中创建对象非常轻量级,我也同意这一点。

但问题是它如何与完全不同的东西(如 uuid 生成)进行比较?

因此,怀疑分配对象需要多少 cpu 周期以及涉及哪些具体步骤?

最佳答案

在 Java 中创建对象可能需要零到数十亿个周期。

  • 零:当对象没有脱离局部范围时,JIT 编译器可能会由于分配消除优化而用局部变量替换分配。
  • 数十亿,因为任何分配都可能触发(可能很长)垃圾收集。

我已经在 this 中对 HotSpot JVM 中的分配进行了高级概述。和 this回答。

在 TLAB 中分配对象的最常见方法包括以下步骤:

  1. 加载 tlab_top 指针(在 x64 上通常有一个专用的 CPU 寄存器用于线程局部变量)。
  2. 按对象的大小增加它。
  3. tlab_top + object_sizetlab_end 进行比较。如果需要,跳到慢速路径。
  4. 存储tlab_top 的新值。之前的值是新创建对象的地址。
  5. 设置对象的默认标题。
  6. 设置 klass 字段 - 指向对象类元数据的指针。
  7. 用零初始化其余对象数据。即使没有字段的对象也可能有对齐填充。

这些都是大约 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 生成算法相比,这确实便宜。

关于algorithm - 在 Java 中创建一个对象需要多少个 CPU 周期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38295391/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com