GuavaのImmutableList試してみた。
あるOSSのコードを見てたらImmutableListなるものがあったので速度を試してみた。
Guava(= google + java) というgoogleによるコレクションの実装らしく早いらしい。
import java.util.ArrayList; import java.util.Random; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableBiMap.Builder; import com.google.common.util.*; public class Test{ public static void main(String[] args){ // 試行回数 final int NUMBEROFTRIAL = 100; // 1試行のアクセス数 final int NUMBEROFREFFERENCE = 200000; // 配列・アクセスの範囲 final int NUM = 100000; // 平均アクセス時間 long arrayListTime = 0; long immutableListTime = 0; Random random = new Random(); // アクセスするindex int[] access = new int[NUMBEROFREFFERENCE]; int hoge; System.out.println("ArraySize, ArrayList, ImmutableList"); for(int num=0; num<NUM; num+=100){ for(int i=0; i<NUMBEROFTRIAL; i++){ // ArrayList生成 ArrayList<Integer> arrayList = new ArrayList<Integer>(); for(int j=0; j<NUM; j++){ arrayList.add(j); } // ImmutableList生成 ImmutableList<Integer> immutableList =ImmutableList.copyOf(arrayList); for(int j=0; j<NUMBEROFREFFERENCE; j++){ access[j] = random.nextInt(NUM); } // ArrayListアクセス long startTime, finishTime; startTime = System.currentTimeMillis(); for(int j=0; j<NUMBEROFREFFERENCE; j++){ hoge = arrayList.get(access[j]) + 2; } finishTime = System.currentTimeMillis(); arrayListTime += (finishTime - startTime); // ImmutableListアクセス startTime = System.currentTimeMillis(); for(int j=0; j<NUMBEROFREFFERENCE; j++){ hoge = immutableList.get(access[j]) + 2; } finishTime = System.currentTimeMillis(); immutableListTime += (finishTime - startTime); } // 結果発表 System.out.println(num + ", " + arrayListTime +", "+ immutableListTime); } } }
実験結果
青がArrayListで赤がImmutableList。
確かに早くなってる。一番コレクションのサイズが大きい時で5.8%早くなった。