ひがやすを技術ブログ

電通国際情報サービスのプログラマ

cglib-2.0-RC2.jarのパフォーマンス

http://yamaguch.sytes.net/~tora/diary/?date=20040108を見て、
自分も興味があったので、試してみました。
CLASSPATHに追加したのは、cglib-2.0-RC2.jarと
cglib-src-1.1-RC1.jarのlib/asm.jarです。
環境:JDK1.4.2_03 Windows2000


int iterations = 1000000;
System.out.println();
System.out.println("iteration count: " + iterations);

String test = "abcabcabc";
Class[] types = new Class[] { String.class, Integer.TYPE };
Method indexOf = String.class.getDeclaredMethod("indexOf", types);
FastClass fc = FastClass.create(String.class);
FastMethod fm = fc.getMethod("indexOf", types);
int fidx = fm.getIndex();
Object[] args = new Object[] { "ab", new Integer(1)};
int result;

long start = System.currentTimeMillis();
for (int i = 0; i < iterations; i++) {
result = test.indexOf("ab", 1);
}
long rawTime = System.currentTimeMillis() - start;

start = System.currentTimeMillis();
for (int i = 0; i < iterations; i++) {
result = ( (Integer) indexOf.invoke(test, args)).intValue();
}
long reflectTime = System.currentTimeMillis() - start;

start = System.currentTimeMillis();
for (int i = 0; i < iterations; i++) {
result = ( (Integer) fc.invoke("indexOf", types, test, args)).intValue();
}
long firstClassTime = System.currentTimeMillis() - start;

start = System.currentTimeMillis();
for (int i = 0; i < iterations; i++) {
result = ( (Integer) fm.invoke(test, args)).intValue();
}
long firstMethodTime = System.currentTimeMillis() - start;

start = System.currentTimeMillis();
for (int i = 0; i < iterations; i++) {
result = ( (Integer) fc.invoke(fidx, test, args)).intValue();
}
long firstMethodIndexTime = System.currentTimeMillis() - start;

結果は、

iteration count: 1000000
raw:170
reflectTime:691
fristClassTime:5018
fristMethodTime:490
fristMethodIndexTime:461
FirstClassをメソッド名で呼び出したときはかなり遅い。
どうせ使うなら、メソッドのインデックス指定でやった方がいいみたい。