自动装箱对原始包装器 ArrayList 的性能影响
Performance implications of autoboxing on ArrayList of primitive wrappers
Java 不允许我们直接创建 ArrayList
个基元。但是我们可以创建基元包装器 class.
的 ArrayList
但是当访问原始值时,编译器会自动进行包装和解包。这不是开销吗?我的问题是这对性能有何影响?
在这种情况下,int[]
的表现不会比 ArrayList<Integer>
好吗?
有没有人测量过 int[]
与 ArrayList<Inetger>
对于 Java5.0
(首次引入时)和 Java 的后期版本的性能。如果您能分享测试结果,对遇到这个问题的每个人都非常有帮助。
确实增加了一些开销。如果这对您来说是个问题,请考虑使用一些开箱即用的支持原语集合的库。例如 Trove, Guava 或 google 用于另一个库
A question 被问及同一主题,在 20M 元素上的以下基准测试结果 int[]
与 ArrayList
(我在我的计算机上重新 运行 , 来自@Wsl_F 问题):
public static void main(String[] args) {
int n = 20_000_000;
System.out.println("Warming up...");
list(n);
array(n);
long t0 = System.nanoTime();
int v = list(n);
t0 = System.nanoTime() - t0;
System.out.printf("list %.1f ms (%d)\n", (t0 / 1000000.0), v);
t0 = System.nanoTime();
v = array(n);
t0 = System.nanoTime() - t0;
System.out.printf("array %.1f ms (%d)\n", (t0 / 1000000.0), v);
}
private static int list(int n) {
ArrayList<Integer> list = new ArrayList<>(n);
for (int i = 0; i < n; i++)
list.add(i);
return list.get(n/2);
}
private static int array(int n) {
int[] list = new int[n];
for (int i = 0; i < n; i++)
list[i] = i;
return list[n/2];
}
给我(Eclipse on Ubuntu 16.04 x64 with Intel Core i7):
list 1839,9 ms (10000000)
array 515,9 ms (10000000)
像 Eclipse Collections, FastUtil, Trove, HPPC 这样的库中的原始 collections 会节省您的内存,并且通常比 Java 中的盒装等效项表现更好。每个库都将提供比 int[]
更丰富的方法集。您最好根据自己的具体用例来比较性能。
我发现这篇标题为“Performance Comparison of Primitive Lists in Java”的 Baeldung 文章比较了 FastUtil、Trove 和 Colt 原始列表。
Eclipse Collections 开源库有几个原始 collections 包括 List
、Set
、Bag
、Stack
和 Map
支持所有原始类型。已经有几篇关于性能基准的文章比较了 JDK Collections 与 Eclipse Collections 原语 collections.
的性能
- NatTable + Eclipse Collections = Performance & Memory Improvements?
- Baeldung: Benchmark JDK Collections vs Eclipse Collections
- Optimization Strategies with Eclipse Collections
- Refactoring to Eclipse Collections
NatTable文章对int[]
和List<Integer>
进行了一些比较。
注意:我是 Eclipse 的提交者 Collections
Java 不允许我们直接创建 ArrayList
个基元。但是我们可以创建基元包装器 class.
ArrayList
但是当访问原始值时,编译器会自动进行包装和解包。这不是开销吗?我的问题是这对性能有何影响?
在这种情况下,int[]
的表现不会比 ArrayList<Integer>
好吗?
有没有人测量过 int[]
与 ArrayList<Inetger>
对于 Java5.0
(首次引入时)和 Java 的后期版本的性能。如果您能分享测试结果,对遇到这个问题的每个人都非常有帮助。
确实增加了一些开销。如果这对您来说是个问题,请考虑使用一些开箱即用的支持原语集合的库。例如 Trove, Guava 或 google 用于另一个库
A question 被问及同一主题,在 20M 元素上的以下基准测试结果 int[]
与 ArrayList
(我在我的计算机上重新 运行 , 来自@Wsl_F 问题):
public static void main(String[] args) {
int n = 20_000_000;
System.out.println("Warming up...");
list(n);
array(n);
long t0 = System.nanoTime();
int v = list(n);
t0 = System.nanoTime() - t0;
System.out.printf("list %.1f ms (%d)\n", (t0 / 1000000.0), v);
t0 = System.nanoTime();
v = array(n);
t0 = System.nanoTime() - t0;
System.out.printf("array %.1f ms (%d)\n", (t0 / 1000000.0), v);
}
private static int list(int n) {
ArrayList<Integer> list = new ArrayList<>(n);
for (int i = 0; i < n; i++)
list.add(i);
return list.get(n/2);
}
private static int array(int n) {
int[] list = new int[n];
for (int i = 0; i < n; i++)
list[i] = i;
return list[n/2];
}
给我(Eclipse on Ubuntu 16.04 x64 with Intel Core i7):
list 1839,9 ms (10000000)
array 515,9 ms (10000000)
像 Eclipse Collections, FastUtil, Trove, HPPC 这样的库中的原始 collections 会节省您的内存,并且通常比 Java 中的盒装等效项表现更好。每个库都将提供比 int[]
更丰富的方法集。您最好根据自己的具体用例来比较性能。
我发现这篇标题为“Performance Comparison of Primitive Lists in Java”的 Baeldung 文章比较了 FastUtil、Trove 和 Colt 原始列表。
Eclipse Collections 开源库有几个原始 collections 包括 List
、Set
、Bag
、Stack
和 Map
支持所有原始类型。已经有几篇关于性能基准的文章比较了 JDK Collections 与 Eclipse Collections 原语 collections.
- NatTable + Eclipse Collections = Performance & Memory Improvements?
- Baeldung: Benchmark JDK Collections vs Eclipse Collections
- Optimization Strategies with Eclipse Collections
- Refactoring to Eclipse Collections
NatTable文章对int[]
和List<Integer>
进行了一些比较。
注意:我是 Eclipse 的提交者 Collections