免责声明:我已经查看了这个问题和这个问题 ,但它们都被小细节和一般优化 - 不必要的问题所困扰。我真的需要在我当前的应用程序中获得的所有性能,它正在实时接收-处理-喷出 MIDI 数据。它还需要尽可能地扩大规模 。
我将array
小列表的大量读取性能与ArrayList
手头的变量进行比较。我发现一个数组的节拍ArrayList
是 2.5 倍,甚至比只有对象引用还要好。
我想知道的是:
- 我的基准还好吗?我已经切换了测试的顺序和运行次数,没有任何变化。我也使用毫秒而不是纳秒无济于事。
- 我应该指定任何 Java 选项来最小化这种差异吗?
- 如果这种差异是真实的,在这种情况下,我不应该更喜欢
Test[]
在ArrayList<Test>
这种情况下并放入转换它们所需的代码吗?显然,我阅读的内容远多于写作。
JVM 是 OSX 上的 Java 1.6.0_17,它肯定在热点模式下运行。
public class ArraysVsLists {
static int RUNS = 100000;
public static void main(String[] args) {
long t1;
long t2;
Test test1 = new Test();
test1.thing = (int)Math.round(100*Math.random());
Test test2 = new Test();
test2.thing = (int)Math.round(100*Math.random());
t1 = System.nanoTime();
for (int i=0; i<RUNS; i++) {
test1.changeThing(i);
test2.changeThing(i);
}
t2 = System.nanoTime();
System.out.println((t2-t1) + " How long NO collection");
ArrayList<Test> list = new ArrayList<Test>(1);
list.add(test1);
list.add(test2);
// tried this too: helps a tiny tiny bit
list.trimToSize();
t1= System.nanoTime();
for (int i=0; i<RUNS; i++) {
for (Test eachTest : list) {
eachTest.changeThing(i);
}
}
t2 = System.nanoTime();
System.out.println((t2-t1) + " How long collection");
Test[] array = new Test[2];
list.toArray(array);
t1= System.nanoTime();
for (int i=0; i<RUNS; i++) {
for (Test test : array) {
test.changeThing(i);
}
}
t2 = System.nanoTime();
System.out.println((t2-t1) + " How long array ");
}
}
class Test {
int thing;
int thing2;
public void changeThing(int addThis) {
thing2 = addThis + thing;
}
}