今日も最近あちこちで使われているオープンソースソフトウェアをとりあげます。
今日紹介するのは、ASMといライブラリです。ASMはバイトコードを動的に生成して、クラスファイルを読み込み時に変更したりする目的で使われます。
同じ様な機能をもつライブラリにBCELやSERPがありますが、ASMのWebサイトでは、ASMはこれらより、サイズが小さく、かつ速いと主張されています。
たしかにASMのコアは14クラスしかなくて、jarファイルはたったの25Kです。これに対して、BCELは350K,SERPは150Kだそうです。
スピードに関しては、クラスをロード時のオーバーヘッドがASMの場合は+60%なのにたいして、BCELは700%以上、SERPは1100%以上だ、ということです。
こんなにパフォーマンスが違うのはASMはBCELとかとはバイトコード変換の方式が全然違うからです。
BCEL等はJavaのクラスファイルのツリー構造をそのまま表現するオブジェクトを生成し、それを操作するというアプローチをとっていますが、これはツリー構造を表現するために多くのクラスを必要とする(=ライブラリのサイズが大きくなる)し、オブジェクト生成のコストも高くつきます。
これに対してASMはVisitorパターンを採用することによってこの問題を回避しています。詳しい事はASMのドキュメントに記述されています。とても興味深い内容なので、後日詳しく紹介できたらいいなと思います。
最近クラスの読み込み時にバイトコードを動的に変更するということが普通に行われるようになりつつあり、JDK1.5ではjava.lang.instrumentパッケージによってクラスファイルを読み込み時に変更するためのインターフェースが標準化されてしまっていたりします。
と、いうようなことがあってこの手の技術には注目しています。
今日紹介するのは、ASMといライブラリです。ASMはバイトコードを動的に生成して、クラスファイルを読み込み時に変更したりする目的で使われます。
同じ様な機能をもつライブラリにBCELやSERPがありますが、ASMのWebサイトでは、ASMはこれらより、サイズが小さく、かつ速いと主張されています。
たしかにASMのコアは14クラスしかなくて、jarファイルはたったの25Kです。これに対して、BCELは350K,SERPは150Kだそうです。
スピードに関しては、クラスをロード時のオーバーヘッドがASMの場合は+60%なのにたいして、BCELは700%以上、SERPは1100%以上だ、ということです。
こんなにパフォーマンスが違うのはASMはBCELとかとはバイトコード変換の方式が全然違うからです。
BCEL等はJavaのクラスファイルのツリー構造をそのまま表現するオブジェクトを生成し、それを操作するというアプローチをとっていますが、これはツリー構造を表現するために多くのクラスを必要とする(=ライブラリのサイズが大きくなる)し、オブジェクト生成のコストも高くつきます。
これに対してASMはVisitorパターンを採用することによってこの問題を回避しています。詳しい事はASMのドキュメントに記述されています。とても興味深い内容なので、後日詳しく紹介できたらいいなと思います。
最近クラスの読み込み時にバイトコードを動的に変更するということが普通に行われるようになりつつあり、JDK1.5ではjava.lang.instrumentパッケージによってクラスファイルを読み込み時に変更するためのインターフェースが標準化されてしまっていたりします。
と、いうようなことがあってこの手の技術には注目しています。