かまたま日記3

プログラミングメイン、たまに日常

Setの展開はどれが一番早い?

追記

(続)Setの展開はどれが一番早い? - かまたま日記2
再調査をしたところ結果が変わっています。

  • -

ってことで調査してみました。

  1. toArray()で配列に変換してから展開
  2. for-eachで展開
  3. iteratorを使って展開
  4. Listに変換してから展開
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;


public class SetExpansionTest {
	public static void main(String[] args) {
		int testcount = 5000000;
		
		Set<String> testSet = new HashSet<String>();
		for (int i = 0; i < testcount; i++) {
			testSet.add("test" + i);
		}
		
		long start = System.currentTimeMillis();
		String[] array = testSet.toArray(new String[testcount]);
		int count = 0;
		for (int i = 0; i < array.length; i++) {
			count++;
		}
		System.out.println("toArray:" + (System.currentTimeMillis()-start) + " count:" +count);

		start = System.currentTimeMillis();
		count = 0;
		for (String string : testSet) {
			count++;
		}
		System.out.println("foreach:" + (System.currentTimeMillis()-start) + " count:" +count);
		
		start = System.currentTimeMillis();
		count = 0;
		for (Iterator iterator = testSet.iterator(); iterator.hasNext();) {
			iterator.next();
			count++;
		}
		System.out.println("iterator:" + (System.currentTimeMillis()-start) + " count:" +count);
		
		start = System.currentTimeMillis();
		List<String> testList = new ArrayList<String>(testSet);
		count = 0;
		for (String string : testList) {
			count++;
		}
		System.out.println("list:" + (System.currentTimeMillis()-start) + " count:" +count);

	}
}

結果

100万件

toArray:48 count:1000000
foreach:30 count:1000000
iterator:29 count:1000000
list:50 count:1000000

500万件

toArray:158 count:5000000
foreach:126 count:5000000
iterator:130 count:5000000
list:436 count:5000000

普通にforeachもしくはiteratorで回すのが一番見たいです。
toArrayとListは変換コストがバカにならない様子。