リストとセットの検索時間の計測 2015/12
実行プログラムコード
テスト結果(ミリ秒)
結論
テスト概要
- リストとセットの検索時間を計測する。
- 容量10,000のArrayListとHashSetを用意し、それぞれに0から10,000までの整数を入れる。
- 20,000個の乱数(0~20,000)を用意して、ArrayListはindexOfメソッドで、HashSetはcontainsメソッドで中身に含まれているかを検索する。
- 2回ずつ繰り返して時間を計測する。
テスト環境
マシン : 東芝 dynabook R73/W6M
CPU : i7-4710MQ 2.50GHz
MEM : 8GB
OS : Windows 8.1 64bit
Java : 1.8.0.31
Eclipse : 4.4.1
実行プログラムコード
import java.util.ArrayList; import java.util.HashSet; import java.util.Random; public class ListOrSet { final int CAPACITY = 10000; // リストの検索速度と、セットの検索速度を比較するプログラム。 public static void main(String[] args) { // アイドリング for (int i = 0; i < 100; i++) { System.out.println("Do Initialize..." + i); } ListOrSet obj = new ListOrSet(); long timeList = 0L; long timeSet = 0L; Integer[] first = obj.getRandomArray(); Integer[] second = obj.getRandomArray(); ArrayListtestList = obj.initList(); HashSet testSet = obj.initSet(); timeList += obj.findInList(testList, first); timeSet += obj.findInSet(testSet, second); // 中休み for (int i = 0; i < 100; i++) { System.out.println("Now Breaking..." + i); } timeList += obj.findInList(testList, first); timeSet += obj.findInSet(testSet, second); // 結果を表示 System.out.println("timeList : " + timeList); System.out.println("timeSet : " + timeSet); } ListOrSet() {} // 乱数配列の生成。 Integer[] getRandomArray() { int testRange = CAPACITY * 2; Random random = new Random(); Integer[] randoms = new Integer[testRange]; for (int i = 0; i < testRange; i++) { randoms[i] = random.nextInt(testRange); } return randoms; } // テスト用リストの初期可。 ArrayList initList() { ArrayList data = new ArrayList (CAPACITY); for (int i = 0; i < CAPACITY; i++) { data.add(i); } return data; } // テスト用セットの初期化。 HashSet initSet() { HashSet data = new HashSet (CAPACITY); for (int i = 0; i < CAPACITY; i++) { data.add(i); } return data; } // リストに要素が含まれているか検索する。 // indexOfメソッドを呼ぶ。 long findInList(ArrayList data, Integer[] randoms) { int found = -1; long then = System.currentTimeMillis(); for (int i = 0; i < randoms.length; i++) { found = data.indexOf(randoms[i]); } long now = System.currentTimeMillis(); return now - then; } // セットに要素が含まれているか検索する。 // containsメソッドを呼ぶ。 long findInSet(HashSet data, Integer[] randoms) { boolean found; long then = System.currentTimeMillis(); for (int i = 0; i < randoms.length; i++) { found = data.contains(randoms[i]); } long now = System.currentTimeMillis(); return now - then; } }
テスト結果(ミリ秒)
ArrayList indexOf | HashSet contains | |
---|---|---|
1回目 | 250 | 0 |
2回目 | 234 | 16 |
3回目 | 235 | 0 |
4回目 | 235 | 15 |
5回目 | 234 | 0 |
6回目 | 234 | 0 |
7回目 | 234 | 0 |
8回目 | 250 | 0 |
9回目 | 234 | 0 |
10回目 | 234 | 0 |
結論
- 検索速度では、セットは比較にならないほどリストよりも早い。