[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends] Re: ラッパークラスの配列からプリミティブの配列へのコピー








みやざき@東洋情報%先日入会しました。よろしくお願いします(__)

ENDO Yasuyuki <yasuyuki@xxxxxxxxxx> wrote:
>単純版、リフレクション版、JNI版で、
>「配列コピー・ベンチマーク大会」も面白い気がします。

こんなの作ってみました(^^;(末尾参照)
かなりいい加減なベンチマークもどきです。

この結果は次の通り(JDK1.1.7A + NT4.0(P2の333MHz))
-------
C:\JAVA\INTARRAY>java IntArrayBenchMark
Arrays.IntegersToIntArray:
110
WrapperArrayToPrimitiveArray:
6209
Int.toIntArray:
90

C:\JAVA\INTARRAY>java -nojit IntArrayBenchMark
Arrays.IntegersToIntArray:
381
WrapperArrayToPrimitiveArray:
7991
Int.toIntArray:
361
--------
Int.toIntArrayが一番速く、refrectionを用いたものが、
かなり遅くなってます(^^;

まだ考察をしてないんで、とりあえず結果のみにて。
それでは。

//////////////////////////////////////////////////////////////////////
//東洋情報システム・オープンソリューション事業部ソリューション営業部
//                                 宮崎靖士   e-mail:soara@xxxxxxxxxx
//////////////////////////////////////////////////////////////////////

<< 実行ソース (IntArrayBenchMark.java) >>
import java.lang.reflect.Array;
import java.lang.reflect.Method;

public class IntArrayBenchMark {
  private IntArrayBenchMark() {}

  // Shin版
  static final Object
    WrapperArrayToPrimitiveArray(Object[] from, Class primitiveClass)
      throws Exception {
     String    toTypeName = primitiveClass.toString();
     // primitive配列にPutするメソッドね
     String    setValueMethodName =
       "set" +
         toTypeName.substring(0, 1).toUpperCase() +
toTypeName.substring(1);
     Method    setValueMethod =
       Array.class.getMethod
         (setValueMethodName,
          new Class[]{ Object.class, int.class, primitiveClass });
     // PrimitiveType配列の生成
     Object to = Array.newInstance(primitiveClass, from.length);

     for (int i = 0; i < from.length; i++) {
       setValueMethod.invoke
         (from[i],
          new Object[]{to, new Integer(i), from[i]});
     }
     return to;
      }

  // ベンチマーク
  public static void main(String argv[]) throws Exception {
    // まずは準備
    final int INDEX = 100;
    final int LOOPS = 10000;
    {
      Integer intobjarray[] = new Integer[INDEX];
      for(int i = 0; i < INDEX; i++) {
     intobjarray[i] = new Integer(i);
      }
      {
     // 遠藤版その1
     long now = System.currentTimeMillis();
     for(int i = 0; i < LOOPS; i++){
       int[] intarray = Arrays.IntegersToIntArray(intobjarray);
     }
     System.out.println("Arrays.IntegersToIntArray: ");
     System.out.println(System.currentTimeMillis() - now);
      }
      {
     // Shin版
     long now = System.currentTimeMillis();
     for(int i = 0; i < LOOPS; i++){
       int[] intarray =
         (int[])IntArrayBenchMark.WrapperArrayToPrimitiveArray
           (intobjarray, int.class);
     }
     System.out.println("WrapperArrayToPrimitiveArray: ");
     System.out.println(System.currentTimeMillis() - now);
      }
    }
    {
      Int intobjarray[] = new Int[INDEX];
      for(int i = 0; i < INDEX; i++) {
     intobjarray[i] = new Int(i);
      }
      {
     // 遠藤版その2
     long now = System.currentTimeMillis();
     for(int i = 0; i < LOOPS; i++){
       int[] intarray = Int.toIntArray(intobjarray);
     }
     System.out.println("Int.toIntArray: ");
     System.out.println(System.currentTimeMillis() - now);
      }
    }
  }
}

// 遠藤版その1
class Arrays {
  public static final int[] IntegersToIntArray(Integer[] integers) {
    int[] intarray = null;
    if (integers != null) {
      intarray = new int[integers.length];
      for (int i=0; i<integers.length; i++) {
     intarray[i] = integers[i].intValue();
      }
    }
    return intarray;
  }
}

// 遠藤版その2
class Int {
  public int i;
  Int(int i) { this.i = i; }
  public static int[] toIntArray(Int[] ints) {
    int[] intarray = new int[ints.length]; // nullになってた(NullPointerEx)
    if (ints != null) {
      for (int n=0; n<ints.length; n++) {
     intarray[n] = ints[n].i;
      }
    }
    return intarray;
  }
}