締切駆動型人間の日常

間違ってたら教えてくだしゃい

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);
		}
	}
}

実験結果
f:id:zeroplanet:20150712194138p:plain

青がArrayListで赤がImmutableList。
確かに早くなってる。一番コレクションのサイズが大きい時で5.8%早くなった。