【发布时间】:2022-01-04 15:36:41
【问题描述】:
我在将第一个和第二个项目添加到集合中时遇到了巨大的性能差异(尝试过 ArrayList 和 HashSet),但我无法解释原因。已搜索但未找到任何答案。
public class Main {
public static void main(String[] args) {
// also tried HashSet
// also tried new ArrayList<>(2)
ArrayList<String> collection = new ArrayList<>();
long t1 = System.nanoTime();
collection.add("a");
long t2 = System.nanoTime();
collection.add("b");
long t3 = System.nanoTime();
System.out.println(String.valueOf(t2 - t1) + "\n"
+ String.valueOf(t3 - t2));
//typical output:
//4399
//1201
}
}
一些猜测:
- 因为添加第一项时集合被延迟初始化?
- 还是我使用了错误的方法来衡量性能?
- 或与 jvm 的工作方式有关(我不知道)?
环境:jdk11、win10、intellij。
【问题讨论】:
-
可能有很多原因。一般来说,这不是一个好的基准,JVM 必须预热、加载类和编译代码。这可能会以某种未指定的顺序发生。
-
差异为 3µs,即使在硬实时环境中也肯定不明显。要获得更相关的结果,请创建一个执行时间为几秒的测试程序,然后查看第一次和第二次添加之间是否仍然存在显着差异(可能仍然不是有效的基准,但比当前测试要好得多)。然后使用分析器查看程序的哪一部分消耗了 CPU 时间。
标签: java performance arraylist collections timing