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