gpt4 book ai didi

java - 对象 vs byte[0] 作为锁

转载 作者:搜寻专家 更新时间:2023-11-01 00:59:18 25 4
gpt4 key购买 nike

我之前评论过 this question (“为什么 java.lang.Object 不是抽象的?”)说我听说使用 byte[0] 作为锁比使用 java.lang 更有效.对象。我确定我在某个地方读过这篇文章,但我不记得在哪里读过:有人知道这是不是真的吗?

我怀疑这是由于 byte[0] 的实例化需要比 Object 略少的字节码,尽管有人指出 byte[0] 需要额外的存储空间来存储长度字段,因此听起来这可能会抵消任何好处。

最佳答案

使用 java.lang.instrument.Instrumentation 检查尺寸:
Object使用8个字节,byte[0]需要16个字节。 (不确定大小是否以字节为单位,未记录)。

我也有时间创建一个 Object 和一个 byte[0](2 次):Object 是赢家。

(所有测试均在 DELL 笔记本电脑、Intel 2GHz、Windos XP 上运行)

使用客户端虚拟机

java version "1.6.0_16"
Java(TM) SE Runtime Environment (build 1.6.0_16-b01)
Java HotSpot(TM) Client VM (build 14.2-b01, mixed mode)

an implementation-specific approximation of the amount of storage
Object = 8
byte[0] = 16

time to create 1000000000 instances
Object: elapsed=11,140 cpu=9,766 user=9,703 [seconds]
byte[0]: elapsed=18,248 cpu=15,672 user=15,594 [seconds]

time to create 1000000000 instances
Object: elapsed=11,135 cpu=9,828 user=9,750 [seconds]
byte[0]: elapsed=18,271 cpu=15,547 user=15,469 [seconds]

使用服务器虚拟机

java version "1.6.0_16"
Java(TM) SE Runtime Environment (build 1.6.0_16-b01)
Java HotSpot(TM) Server VM (build 14.2-b01, mixed mode)

an implementation-specific approximation of the amount of storage
Object = 8
byte[0] = 16

time to create 1000000000 instances
Object: elapsed=8,441 cpu=7,156 user=7,125 [seconds]
byte[0]: elapsed=11,237 cpu=8,609 user=8,500 [seconds]

time to create 1000000000 instances
Object: elapsed=8,501 cpu=7,234 user=7,156 [seconds]
byte[0]: elapsed=11,023 cpu=8,688 user=8,641 [seconds]

我将继续使用 new Object(),不仅仅是因为可读性:-)

代码

public class ObjectArrayCompare {

private static Object o;

public static void main(String[] args) {
Instrumentation instr = InstrumentationAgent.getInstrumentation();
if (instr == null) {
System.err.println("No Instrumentation, use \"-javaagent:Instrumentation.jar\"");
return;
}
System.out.println();
System.out.println("an implementation-specific approximation of the amount of storage");
System.out.println("Object = " + instr.getObjectSize(new Object()));
System.out.println("byte[0] = " + instr.getObjectSize(new byte[0]));
System.out.println();

final int MAX = (int) 1.0e9;
Timer timer;
Times times;

for (int j = 0; j < 2; j++) {
System.out.println("time to create " + MAX + " instances");
timer = new Timer();
for (int i = 0; i < MAX; i++) {
o = new Object();
}
times = timer.times();
System.out.println("Object: " + times);

timer = new Timer();
for (int i = 0; i < MAX; i++) {
o = new byte[0];
}
times = timer.times();
System.out.println("byte[0]: " + times);

System.out.println();
}
}
}

Timer* 使用 ThreadMXBean 获取时间。

* Timer 是我为计时而制作的类,它不是 Java Timer 的类之一。

关于java - 对象 vs byte[0] 作为锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2120437/

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