gpt4 book ai didi

java - 测量 Java 中对象创建的性能

转载 作者:行者123 更新时间:2023-11-30 02:31:55 25 4
gpt4 key购买 nike

我正在尝试比较创建某个类的对象与从 byte[] 创建 String 的性能。这是我为此编写的基准:

public class MyBenchmark {
@Benchmark
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public void tsts(Blackhole b) {
b.consume(new TestClass(i(), str()));
}

@Benchmark
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public void str(Blackhole b) {
b.consume(new String(b()));
}

@CompilerControl(CompilerControl.Mode.DONT_INLINE)
public String str(){
return "asdasfa";
}

@CompilerControl(CompilerControl.Mode.DONT_INLINE)
public int i(){
return 23;
}

@CompilerControl(CompilerControl.Mode.DONT_INLINE)
public byte[] b(){
return new byte[]{49, 66, 43, 65, 78, 123, 96, 54};
}
}

哪里

private static class TestClass{
private int i;
private String s;

public TestClass(Integer i, String s) {
this.i = i;
this.s = s;
}
}

在我的机器上我得到了以下结果:

Benchmark         Mode  Cnt   Score   Error  Units
MyBenchmark.str avgt 20 47.695 ± 1.869 ns/op
MyBenchmark.tsts avgt 20 6.999 ± 0.191 ns/op

这样做的正确方法吗?或者我在基准测试中犯了一些错误并错过了一些东西?

最佳答案

这是因为 JIT 知道文字字符串实例(“asdasfa”)的确切地址。因此在这种情况下不需要创建新对象。反编译str()方法就可以清楚地看到:

0x000000010dd1a2b0: sub    rsp,0x18
0x000000010dd1a2b7: mov QWORD PTR [rsp+0x10],rbp ;
0x000000010dd1a2bc: movabs rax,0x1bc1f1440 ; {oop("asdasfa")}
0x000000010dd1a2c6: add rsp,0x10
0x000000010dd1a2ca: pop rbp
0x000000010dd1a2cb: test DWORD PTR [rip+0xfffffffffe642d2f],eax # 0x000000010c35d000;
0x000000010dd1a2d1: ret

该方法由一条指令 movabs rax,0x1bc1f1440 组成,它将一个地址放入 rax 寄存器,这就是为什么它要快得多。其他说明是辅助性的。

对于另一个方法 str(Blackhole b),您将看到更多内容,包括 String 构造函数的编译主体,通过方法调用获取默认字符集和字节数组解码。

关于java - 测量 Java 中对象创建的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44087324/

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