Java阵列/ArrayList/LinkedList性能
我使用以下代码测试了Array/ArrayList/LinkedList之间的性能Java阵列/ArrayList/LinkedList性能,java,performance,Java,Performance,我使用以下代码测试了Array/ArrayList/LinkedList之间的性能 import java.util.ArrayList; import java.util.LinkedList; public class Main3 { public static void main(String[] args) throws Exception{ int n = 20000000; long bt = 0, et = 0; int
import java.util.ArrayList;
import java.util.LinkedList;
public class Main3 {
public static void main(String[] args) throws Exception{
int n = 20000000;
long bt = 0, et = 0;
int[] a0 = new int[n];
ArrayList<Integer> a1 = new ArrayList<>(n);
LinkedList<Integer> a2 = new LinkedList<>();
Integer[] a3 = new Integer[n];
bt = System.currentTimeMillis();
for(int i=0; i<n; i++){
a0[i] = i;
}
et = System.currentTimeMillis();
System.out.println("===== loop0 time =======" + (et - bt));
bt = System.currentTimeMillis();
for(int i=0; i<n; i++){
a1.add(i);
}
et = System.currentTimeMillis();
System.out.println("===== loop1 time =======" + (et - bt));
bt = System.currentTimeMillis();
for(int i=0; i<n; i++){
a2.add(i);
}
et = System.currentTimeMillis();
System.out.println("===== loop2 time =======" + (et - bt));
bt = System.currentTimeMillis();
for(int i=0; i<n; i++){
a3[i] = i;
}
et = System.currentTimeMillis();
System.out.println("===== loop3 time =======" + (et - bt));
}
}
为什么ArralyList/LinkedList比array慢?
我怎样才能提高性能
环境:
Java:jdk1.8.0çu
谢谢您的基准中存在潜在的不准确之处,但结果的总体排名可能是正确的。如果您在计时之前对代码进行“预热”,以允许JIT编译器生成本机代码并对其进行优化,那么所有基准测试的结果可能会更快。一些基准结果可能更接近甚至相等 迭代
int
数组要比迭代整型对象的列表
快得多。LinkedList
将是最慢的。这些陈述假设乐观主义者不会做出根本性的改变
让我们看看原因:
int
数组(int[]
)是包含端到端排列的4字节int的连续内存区域。循环遍历并设置元素只需依次通过内存块设置4个字节。原则上需要进行索引检查,但实际上,优化人员可以意识到这不是必要的,并将其删除。JIT编译器能够基于本机CPU指令优化这类事情
Integer
对象的ArrayList
包含指向单个Integer
对象(或为空)的引用数组。每个Integer
对象都必须单独分配(尽管Java可以重用小整数)。分配新对象会有开销,此外,引用可能是8字节而不是4字节。此外,如果未指定列表大小(尽管在您的情况下是这样),则可能需要重新分配内部数组。调用add
方法而不是直接分配给数组会产生开销(不过优化器可能会删除此项)
您的Integer
基准数组与数组列表类似,但没有list add方法调用(必须跟踪列表大小)的开销。不过,您的基准可能夸大了此数组和数组列表之间的差异
LinkedList
是最坏的情况。链表被优化插入中间。除了需要分配的Integer
对象之外,它们还有指向列表中下一项的引用和保存这些引用的节点。这是一个巨大的内存开销,也需要一些初始化,除非您希望在列表的中间插入大量元素,否则您不会使用链表。Related:另请查看不要运行自己的基准测试。你会做错事,而且你不需要做(你肯定可以找到现有的合适的基准)。第二,即使忽略错误的基准测试,情况也是如此。阵列是最快的,但它们的大小是固定的。如果您需要一个列表
,那么ArrayList
是您的最佳选择,并且LinkedList
的实际使用案例非常少。您好,无论我的基准测试程序有多差,性能问题仍然存在。正如这个链接所说,我可以忽略性能。但实际情况是我不能。ArrayList很慢,对我的工作影响很大。因此,您能否提供一些有用的建议,而不仅仅是关注基准代码的糟糕程度。谢谢。我投票决定重新讨论这个问题,我认为OP是对的,问题不是关于基准测试,而是关于提高代码的性能。OP需要添加他希望被查找的代码
===== loop0 time =======11
===== loop1 time =======6776
===== loop2 time =======17305
===== loop3 time =======56