無料で使えるシステムトレードフレームワーク「Jiji」 をリリースしました!

・OANDA Trade APIを利用した、オープンソースのシステムトレードフレームワークです。
・自分だけの取引アルゴリズムで、誰でも、いますぐ、かんたんに、自動取引を開始できます。

続 リフレクションはやっぱり重いのか?

昨日の続き。フィールド値の読み込みなど、他に気になっている操作についても測ってみました。

  • 特定の処理を50万回実行した場合の合計所要時間を計測する。(←回数を増やした)
  • 10回試行し平均を取得。
  • JRE1.4,1.5,1.6でそれぞれ測る。
  • 書き忘れたけど、計測マシンは CPU: Pentium4 2.8Ghz、メモリ:1GB です。

結果

まとめ
  • リフレクション呼び出しはやはりそれなりに重い。
  • けど、50万回実行してこの程度の差であれば、よっぽどクリティカルな箇所以外では問題ないのでは。
  • JREごとに見ると、1.6 > 1.4 > 1.5 の順で、1.6が最速(というほど差はないけど)。
  • リフレクションを使ったメソッド呼び出しは、リフレクションを使ったフィールドアクセスより若干早い。でもメソッドやフィールドの検索時間を含むと微妙。
  • 「Class#isInstance(Object)」「Class#isAssignableFrom(Class)」は意外に高速。
メソッドの呼び出し

setメソッドの呼び出しを、

  • 「通常のメソッド呼び出し」
  • 「リフレクションを使った呼び出し(メソッド検索時間は含まない)」
  • 「リフレクションを使った呼び出し(メソッド検索時間を含む)」

の3つの方法で行い、所要時間を計測。

JDK1.42_08 JDK1.5.0_09 JDK1.6update1
メソッド呼び出し 6msec 6msec 6msec
リフレクションを使う(メソッド検索時間は含まない) 381msec 401msec 278msec
リフレクションを使う(メソッド検索時間を含む) 2704msec 3846msec 2789msec
フィールドから値の読み込み

フィールドからの値の読み込みを、

  • 「通常のフィールド参照」
  • 「リフレクションを使った読み込み(フィールド検索時間は含まない)」
  • 「リフレクションを使った読み込み(フィールド検索時間を含む)」

の3つの方法で行い、所要時間を計測。

JDK1.42_08 JDK1.5.0_09 JDK1.6update1
通常のフィールド参照 4msec 4msec 4msec
リフレクションを使った読み込み(フィールド検索時間は含まない) 492msec 578msec 412msec
リフレクションを使った読み込み(フィールド検索時間を含む) 3317msec 3671msec 2760msec
フィールドへの値の書き込み

フィールドへの値の書き込みを、

  • 「通常のフィールドへの代入」
  • 「リフレクションを使った書き込み(フィールド検索時間は含まない)」
  • 「リフレクションを使った書き込み(フィールド検索時間を含む)」

の3つの方法で行い、所要時間を計測。

JDK1.42_08 JDK1.5.0_09 JDK1.6update1
通常のフィールド代入 6msec 6msec 6msec
リフレクションを使った書き込み(フィールド検索時間は含まない) 540msec 651msec 443msec
リフレクションを使った書き込み(フィールド検索時間を含む) 2685msec 4290msec 2281msec
instanceof

クラスの実装であるかどうかの判定を、

  • 「str instanceof String」
  • 「String.class.isInstance( str )」
  • 「String.class.isAssignableFrom( str.getClass() )」

の3つの方法で行い、所要時間を計測。

JDK1.42_08 JDK1.5.0_09 JDK1.6update1
str instanceof String 4msec 9msec 6msec
String.class.isInstance( str ) 37msec 34msec 32msec
String.class.isAssignableFrom( str.getClass() ) 43msec 43msec 34msec