←フエルチラシノウラ。トップページへもどる。

【Java】ListやMapの繰り返し処理のパフォーマンステスト。

Java 配列 List Map Collection 速度計測 繰り返し処理 ループ処理

【Java】ListやMapの繰り返し処理のパフォーマンステスト。

説明


コーディングの中で頻繁に利用する繰り返し処理。
どのクラスを使い、どんなコーディングをすれば一番早いのかを検証してみました。
検証したのは以下のとおり。

1. String[] をindexアクセスで回す
2. ArrayList を get で回す
3. ArrayList を Iterator で回す
4. ArrayList を for (String str : list){...} なfor文で回す
5. HashMap を get で回す
6. HashMap を Iterator で回す
7. TreeMap を get で回す
8. TreeMap を Iterator で回す

サンプル


import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.TreeMap;

public class LoopTest {

private int SIZE = 99999;

private HashMap<String, String> map;
private TreeMap<String, String> tree;
private ArrayList<String> list;
private String[] arr;

public static void main(String[] args) {
new LoopTest().run();
}

public void run() {
// データ作成
createArr();
createMap();
createList();
createTree();
// テスト実行
testArrGet();
testListIterator();
testListIterator2();
testListGet();
testMapIterator();
testMapGet();
testTreeIterator();
testTreeGet();

}

private void createTree() {
tree = new TreeMap<String, String>();
for (int i = 0; i < SIZE; i++) {
tree.put("" + i, "" + i);
}
}

private void createArr() {
arr = new String[SIZE + 1];
for (int i = 0; i < SIZE; i++) {
arr[i] = "" + i;
}
}

private void createList() {
list = new ArrayList<String>();
for (int i = 0; i < SIZE; i++) {
list.add("" + i);
}
}

private void createMap() {
map = new HashMap<String, String>();
for (int i = 0; i < SIZE; i++) {
map.put("" + i, "" + i);
}

}

private void testTreeGet() {
long start = System.currentTimeMillis();
for (int i = 0; i < tree.size(); i++) {
String tmp = tree.get("" + i);
}
long end = System.currentTimeMillis();

System.out.println("testTreeGet:" + (end - start));
}

private void testTreeIterator() {
long start = System.currentTimeMillis();
for (Iterator<String> it = tree.values().iterator(); it.hasNext();) {
String tmp = it.next();
}
long end = System.currentTimeMillis();

System.out.println("testTreeIterator:" + (end - start));
}

private void testArrGet() {
long start = System.currentTimeMillis();
for (int i = 0; i < arr.length; i++) {
String tmp = arr[i];
}
long end = System.currentTimeMillis();

System.out.println("testArrGet:" + (end - start));
}

private void testMapGet() {
long start = System.currentTimeMillis();
for (int i = 0; i < map.size(); i++) {
String tmp = map.get("" + i);
}
long end = System.currentTimeMillis();

System.out.println("testMapGet:" + (end - start));
}

private void testMapIterator() {
long start = System.currentTimeMillis();
for (Iterator<String> it = map.values().iterator(); it.hasNext();) {
String tmp = it.next();

}
long end = System.currentTimeMillis();

System.out.println("testMapIterator:" + (end - start));
}

private void testListGet() {
long start = System.currentTimeMillis();
for (int i = 0; i < list.size(); i++) {
String tmp = list.get(i);
}
long end = System.currentTimeMillis();

System.out.println("testListGet:" + (end - start));
}

private void testListIterator() {
long start = System.currentTimeMillis();
for (Iterator<String> it = list.iterator(); it.hasNext();) {
String tmp = it.next();
}
long end = System.currentTimeMillis();

System.out.println("testListIterator:" + (end - start));
}

private void testListIterator2() {
long start = System.currentTimeMillis();
for (String str : list) {
String tmp = str;
}
long end = System.currentTimeMillis();

System.out.println("testListIterator2:" + (end - start));
}
}


結果


testArrGet:0
testListIterator:13
testListIterator2:0
testListGet:16
testMapIterator:16
testMapGet:109
testTreeIterator:31
testTreeGet:125


以上のような結果となりました。
数値が小さいほど速いということになります。

結論


Listを使うのであれば、testListIterator2メソッドの処理のように、
for (String str : list) {...} な回し方がベスト。
上記の記述だとIterator使うよりもさらに速い。
Mapを使う場合は、Iteratorを利用するべし。
速度が必要でMap機能が必要ないのであれば、できるだけListを使うとよい。

http://goodjob.boy.jp/chirashinoura/id/166.html

作成日: 2007-11-13 13:49:27

最終更新日: 2007-11-13 16:41:48

▲このページの上へ