免責事項:私はこの質問とこの質問に目を通しまし たが、どちらも細部と一般的な最適化は不要な懸念によって脱線しました。現在のアプリで得られるすべてのパフォーマンスが本当に必要です。このアプリは、リアルタイムで MIDI データを受信し、処理し、吐き出しています。また、可能な限りスケールアップする必要があります 。
array
小さなリストの多数の読み取りでのパフォーマンスとArrayList
、変数を手に持っているだけのパフォーマンスを比較しています。私は、配列ArrayList
が 2.5 倍も優れており、オブジェクト参照だけを上回っていることを発見しました。
私が知りたいのは:
- 私のベンチマークは大丈夫ですか?テストの順序と実行回数を変更せずに入れ替えました。また、ナノ秒の代わりにミリ秒を使用しても無駄になりました。
- この違いを最小限に抑えるために、Java オプションを指定する必要がありますか?
- この違いが本当なら、この場合、この状況でそれらを変換するために必要なコードを入れるべきではないでしょ
Test[]
うか?ArrayList<Test>
明らかに、私は書くことよりも多くのことを読んでいます。
JVM は OSX 上の Java 1.6.0_17 であり、間違いなく Hotspot モードで実行されています。
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;
}
}