gpt4 book ai didi

java - 创建预实现的java类的对象比创建自定义对象快得多?

转载 作者:行者123 更新时间:2023-12-01 06:32:50 25 4
gpt4 key购买 nike

class DummyInteger {
private int i;
public DummyInteger(int i) {
this.i = i;
}
public int getI() {
return i;
}
}

long start = System.nanoTime();
DummyInteger n = new DummyInteger(10);
long end = System.nanoTime();
long duration = end - start;
System.out.println(duration);

前面的代码产生以下输出:

341000

鉴于:

long start = System.nanoTime();
ArrayList a = new ArrayList();
long end = System.nanoTime();
long duration = end - start;
System.out.println(duration);

产生以下输出:

17000

现在,我的问题是,为什么我们在运行时间上观察到如此大的差异,尽管 DummyInteger 完成了工作类似乎最多与ArrayList执行的类一样多。构造函数?这与预编译 ArrayList 的代码有关吗?或者是其他一些影响处理时间的因素?

谢谢。

--编辑--

我认为比较两种不同类型的对象会出现问题,但是,即使使用以下代码,与创建 ArrayList 相比也是如此。即:

class IntList {
int [] elementData;

public IntList() {
elementData = new int [20];
}
}

long start = System.nanoTime();
IntList n = new IntList();
long end = System.nanoTime();
long duration = end - start;
System.out.println(duration);

结果仍然是相同的,请记住,在这种情况下,创建 ArrayList 所产生的开销由于执行了某些检查,应该更大,并且可以通过查看源代码找到。

还要注意的一点是,我在两次不同的运行中运行这两个代码,这消除了 JVM 初始化可能产生的任何开销。

最佳答案

why do we observe such difference in the running time?

因为你的测量没有意义:

  • 这是一个有缺陷的微基准测试(没有 JVM 预热,如果您只运行它,那么 JVM 启动可能也会干扰您的测量...)=> How do I write a microbenchmark?
  • nanotime 的分辨率对于您正在测量的操作来说太低了 - 它们可能需要几纳秒,而 nanotime 的分辨率接近 1 毫秒<
<小时/>

以下是我按照更稳健的方法得到的结果:创建一个新的 Integer 大约需要 6 纳秒,而在我的计算机上创建默认大小 (10) 的 ArrayList 大约需要 19 纳秒。

创建虚拟整数:

Run result "newInteger": 6.064 ±(95%) 0.101 ±(99%) 0.167 nsec/op
Run statistics "newInteger": min = 6.007, avg = 6.064, max = 6.200, stdev = 0.081
Run confidence intervals "newInteger": 95% [5.964, 6.165], 99% [5.897, 6.231]

列表创建:

Run result "newList": 19.139 ±(95%) 0.192 ±(99%) 0.318 nsec/op
Run statistics "newList": min = 18.866, avg = 19.139, max = 19.234, stdev = 0.155
Run confidence intervals "newList": 95% [18.948, 19.331], 99% [18.821, 19.458]

编辑

我的“更强大的方法”也有一个缺陷,并且创建实际上是通过厚颜无耻的 JIT 进行优化的......上面的新结果虽然结论相似:这些都是非常快的操作。

关于java - 创建预实现的java类的对象比创建自定义对象快得多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16621951/

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