繁体   English   中英

为什么第一个“新”比其他“慢”?

[英]why the first `new` is slower than the others?

我正在测试Java代码的性能,但是我注意到第一个new操作要比其他操作慢。 为什么?

第一时间new和其他4

Foo g; // The first new in the first iteration
for (int i = 0; i < 5; i++) {
    t1 = System.nanoTime();
    g = new Foo(a[i], b[i]);
    t2 = System.nanoTime();
    v[i] = t2 - t1;
}

v的元素(以ns为单位的时间):

3669398
230476
230611
234191
181668

第一次之后的其他5个new时间

Foo g = new Foo(a[0], b[0]); 
for (int i = 1; i < 6; i++) {
    t1 = System.nanoTime();
    g = new Foo(a[i], b[i]);
    t2 = System.nanoTime();
    v[i - 1] = t2 - t1;
}

v的元素(以ns为单位的时间):

254028
222352
222488
228581
219776

这可能是由于多个问题。

最简单的是,当您执行第一个新类时,可能尚未加载该类,因此类加载器需要首先加载该类。 那取决于实际的代码和环境。

一个更复杂但同样可行的原因是Java优化的方式。 编译后Java没有完成优化。 在运行时,Java一直在不断优化。

例如,通过if语句进行的前几次操作可能会比较慢,但是如果运行时优化器意识到您每次都可能以相同的方式进行分支,则可能会对其进行优化,然后突然在该运行时的余下时间开始更快地运行。

这会对您有多大影响,取决于Foo的工作。 但是,如果这引起您报告的巨大差异(大约高15倍),我会感到惊讶。 我不确定实际的差异是什么,因为我没有测量它们,所以也许我低估了这种可能性。

而且,几次执行动作也不是一个好的基准。 如果您的测试用例真的和您的示例一样简单,那么可能还会有其他问题,而且涉及范围很广。 也许运行时刚刚启动仍然处于沉重的负担中,所以线程会保持屈服,包括在第一次迭代期间。 我可能会wild测,但这就是为什么我们真的需要知道为什么一件事与另一件事不同的原因,所以我们进行了大量测试的一部分。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM