为什么 Collection 的 .addAll 比手动添加慢?
2022-09-02 09:09:05
我运行了两个测试用例(多次),似乎迭代地向我的列表添加值比使用更快addAll
String[] rawArgs = new String[]{"one", "two", "three", "four", "five"};
// More efficient - 894 ns
List<String> list = new ArrayList<>();
for (String s : rawArgs) {
list.add(s);
}
// Less efficient - 1340 ns
List<String> list = new ArrayList<>();
list.addAll(Arrays.asList(rawArgs));
我通过我的IDE以及其他人得到的注释,后一种方法是将数组转换为该数据结构的“正确”方法。但是,如果它实际上比第一个慢,有什么优势(一些晦涩难懂的类型安全?),出于什么原因我应该使用第二个?
编辑 - 代码基准测试:
JVM 预热,首先重新创建主类对象:
public static void main(String[] args) {
Internet test;
for (int i = 0; i < 15; i++) {
test = new Internet(); // JVM warmup
}
test = new Internet();
test.printOutput();
}
我只是在操作的两端采用系统纳米时间:
start = System.nanoTime();
/* function */
end = System.nanoTime();
result = end - start;
其中,测试用例中,每个开始/结束都有单独的字段,并在操作后计算结果(JVM也在运行测试之前通过循环实例抢占预热)。
编辑 2 - 对较大集合进行基准测试
经过一些测试(使用Integed代替,不会手写所有数字),看起来更大的集合确实更慢:
使用 100 个数字:
First operation: 18759ns
Second operation: 2680ns
Total operation: 21439ns