2009年07月25日

【Commons紹介】ArrayIntListの速度

久々にCommons紹介。

Jakarta CommonsのPrimitivesには、ArrayIntListというプリミティブ型のintをそのまま扱えるListがいる。

プリミティブをそのまま扱うので、当然、アクセス速度は速くなるし、メモリの使用量も減るはず。

とりあえず、200万要素追加+各要素の参照をした際の我が家のPCでの速度はこんな感じ。

ArrayList : 591ミリ秒
ArrayIntList : 196ミリ秒


// JRE 1.6.0_07
// Commons Premitives 1.0
// org.apache.commons.collections.primitives.ArrayIntList
// プリミティブ型のintをそのまま扱えるList
// tag Object

// ArrayIntListを使用して、要素の追加+アクセス
start = System.nanoTime();
ArrayIntList intList = new ArrayIntList();
for( int i = 0; i < 2000000; i++ )
intList.add( i );
for( int i = 0; i < 2000000; i++ )
intList.get( i );
System.out.println( System.nanoTime() - start );
// => 196557933

// ArrayList<Integer>を使用して、要素の追加+アクセス
start = System.nanoTime();
ArrayList<Integer> integerList = new ArrayList<Integer>();
for( int i = 0; i < 2000000; i++ )
integerList.add( i );
for( int i = 0; i < 2000000; i++ )
integerList.get( i );
System.out.println( System.nanoTime() - start );
// => 591223383

// 要素を絡めず、空ループした場合の速度
start = System.nanoTime();
for( int i = 0; i < 2000000; i++ );
for( int i = 0; i < 2000000; i++ );
System.out.println( System.nanoTime() - start );
// => 3692208


プリミティブな値は、IntegerやLongのようにObjectとして扱えない。ので、通常のArrayListが1つのクラスで複数の型を扱えるのに対して、ArrayIntListは、intを扱うためだけに1つの実装が必要になったりする。

「ポリモーフィズム、なにそれ?」とか「DRYってビールの銘柄?」という感じの実装にはなるけど、大容量データを使うのであれば、「速さこそ全て」という答えになるのだと思われる。