気が向いたら日記

アクセスカウンタ

help RSS invokedynamic を jdb で stepi したら...(おまけ)

<<   作成日時 : 2012/02/18 00:53   >>

ブログ気持玉 0 / トラックバック 0 / コメント 0

おまけ編です。
クラスファイルに格納されている情報について、整理してみた。

ちなみに、たった一行の JRuby のコード。
print "hello JRuby !"

これを、JRuby 1.6.5.1 と 1.7.0-dev とで AOC(Ahead Of Compile)し、
生成されるクラスファイルの内容を比較した。

■ クラスファイルのバージョン
バージョンJRuby 1.6.5.1JRuby 1.7.0-dev
Major.minor50.051.0

JRuby 1.6.5.1 ではinvokevirtual を使ったコードが生成され、
クラスファイルのバージョンは 50.0 となる。
これは、JDK 6 および JDK 7 で実行できる。

一方、JRuby 1.7.0-dev では invokedynamic を使ったコードを生成する。
したがって、クラスファイルのバージョンは 51.0 となる。
これは、JDK 6 では実行できず、JDK 7 (以降)でのみ実行できる。

■ Constant Pool のエントリ数
Constant PoolJRuby 1.6.5.1JRuby 1.7.0-dev
エントリ数153171

Invokedynamic 関連の情報が格納されるので JRuby 1.7.0-dev が数が多い。

■ Code Size(bytecode命令の数)
メソッドのコードサイズJRuby 1.6.5.1JRuby 1.7.0-dev
setPosition55
コンストラクタ146
static __file__(主処理部分)127
__file__77
load1616
main2929
合計8370

■ invoke* 命令の数
invoke*命令の数JRuby 1.6.5.1JRuby 1.7.0-dev
virtual1710
special43
static66
_dynamic-2
合計2721


全体の命令数および、invoke*命令数の差は、おおそよ、次のことが言えそう。

  • コンストラクタ内で invokevirtual 命令を含む事前準備用の一連のコードがなくなった。
  • static __file__ メソッド(主処理部分)での CallSite の取得に関連する一連のコードがなくなった。
  • static __file__ メソッド(主処理部分)でのメソッド呼び出し命令が invokevirtuak から invokedynamic に置き換えられた。

まずは、invokedynamic が、どう動くのかを実際に見たかったので、
jdb で stepi をしてみたのだけど、

想定は、invokedynamic で stepi したら、ちょっと時間がかかって、
呼出し先(ターゲットメソッド)の先頭でプロンプトが帰ってくるのかなと思ってたので、
実際の途中経過を追いかけることができたのは、期待以上。

でも、それだけが目的ではなく、もう一つの目的がある。

それは、invokedynamic を使うとコードの最適化がされやすくなる、
よって、実行が速くなるということを説明することができるのか..
できるのであれば、それを見てみたい。

そのためには、コードが 1 行の例を使っていてはダメなのは自明で、
もう少し別な例を使って、いろいろ確認してみたい。

その時は、また、つらつらと書くかもしれません。

その前に、
JJUG やら JavaOne Tokyo で情報が得られたりして ...

テーマ

関連テーマ 一覧

月別リンク

ブログ気持玉

クリックして気持ちを伝えよう!
ログインしてクリックすれば、自分のブログへのリンクが付きます。
→ログインへ

トラックバック(0件)

タイトル (本文) ブログ名/日時

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文
invokedynamic を jdb で stepi したら...(おまけ) 気が向いたら日記/BIGLOBEウェブリブログ