【Java】リフレクションを限界まで高速化する

Javaのリフレクションは重いイメージがありましたが、実はインターフェースに押し込んでしまえば(少なくとも関数呼び出しは)全く重くないです。

冗談で書いたエントリですが、閲覧数が多いので真面目なバージョンも用意しました。こちらは実用できるレベルではありますのでよければどうぞ。

このエントリの内容はネタです。 パフォーマンスを何かに憑りつかれたかのように求める人くらいにしか役に立ちません。知ってればいつか役に立つ日が来る…かもしれない。

リフレクションを使った際の関数呼び出しにかかる時間を調べるため、以下の二つのコードを動かしました。改めて考えると意味がないですが。

この2つの実行時間はほぼ同じです。そもそもクラスの生成処理を別の部分から引っ張ってきているだけで、メインのコードはインターフェースを叩いているだけです。

リフレクションは遅くないんだ!で済ませるのは何か負けた気がしたので、意地になって次のコードを実行してみました。

結果、先ほどの2つは同着だったのですが最後のコードは9ms遅れました。とても悔しいです。看過できません。

「インターフェースで関数名指定できないってどんな時だよ」「設計からしてアウト」「リフレクションは保守性が(ry」などの突込みを全て無視して、関数名が定まっていない場合のリフレクションを高速化しました。

関数名が決まってないならinterfaceも当然使えません。当たり前の顔をしてinterfaceを叩いたりしなければ速度はでません。

なので当たり前の顔をして叩きます。

まずCommons BCELをダウンロード、ビルドパスに追加します。

関数名が決まっていない設定でも、とりあえずはvoid method();として進めます。

以下のソースをベタッと貼り付けます。

9ms縮まりました。これって10000回叩いたときの9msの差だから1回だと0.0009ms(この発言は削除されました)

カテゴリー: Java, プログラミング関連 パーマリンク

【Java】リフレクションを限界まで高速化する への2件のフィードバック

  1. ピンバック: Java のリフレクションでインスタンスやメソッドを動的生成する | Futurismo

  2. ピンバック: 【Java】リフレクションの高速化手法 | Gumu-Lab.

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です