[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends-ml 10797] Re: More Java Pitfalls を 読む会第 4 回議事録



村山@NETGENEです.

#少し話題になった名前@所属って書き方は,レオナルド=ダ=ヴィンチも
#似たようなものですね.
##「レオナルド@ヴィンチ村」って意味だそうだから.


> > ・i++ > i=i+1 は本当か?
> Sun J2SE SDK1.4.2のjavacでコンパイルしたJavaバイトコードでは、
> i++の場合
>     iinc    1, 1
> 
> i+=1の場合
>     iinc    1, 1
仕様書を見れば分かりますが,こちらは3byte命令.

> i = i + 1の場合
>     iload_1
>     iconst_1
>     iadd
>     istore_1
> 
> となり、確かにi++の方がバイトコード上は効率が良い結果となります。
こちらは1byte命令 * 4 = 4byte.
なかなか興味深い結果ですね.

ちろんこうなるのはバイトコード=コンパイラの癖の問題で,別のコンパイラを
使えば異なる結果になる可能性もあります.
#ちなみに,まずないとは思うけど,もしこれが
#「iload 1,bipush 1,iadd,istore 1」
#だったら,同じ処理であるにも関わらず2+2+1+2=7byteになる.
#bipushの代わりにsipushを使うと,さらに1バイト無駄になる.


この場合でもJITで変換すると大抵はRISCの一命令に変換されるでしょうから,
最適化された場合の処理速度は同じになるでしょう.組込みの場合はメモリ
の関係であまり複雑な最適化はできず,結果はVMの実装によって変わると
思います.
#若干の速度差よりも「1バイト大きくなる」ということの方が重要かも.(^^;

完全に単純に実装されたインタプリタの場合ならば,多分前者の方が
早くはなるんでしょう.ただiload_<n>にせよiinc にせよ頻繁に使われる
命令なので,インタプリタといえども最適化されている可能性が高い.

となると,実際にどちらがどの程度早いのかは,ちょっと分かりません.
#たしかアプリックスのFTT3なんてのが,インタプリタの最適化技術
#だったと思う.詳細は不明.Jeode,IntentJTEの他,SUNの組込み用
#HotSpotなどは,インタプリタ実装ではない.

ちなみに,picoJavaIIアーキテクチャのフォールディング機構の場合でも,
おそらく速度は(ほぼ)同じになります.前者はフォールディングできない命令
なので,一命令で一クロック.後者は4命令フォールディングして,4命令で
一クロック.内部アーキテクチャがRISCベースである限り,おそらくこれは
避けられない性質と言えるでしょう.


あと,重要な問題として「Javaで書かれたプログラム」の実行時間は,
必ずしも「バイトコードのみで決まるわけではない」ということがあります.
GCやメソッド呼び出し等を除いたとしても,プログラムによっては
ボトルネックはグラフィックや通信等になるかもしれません.その
場合はバイトコードの性能を数%上げることは,ほとんど無意味です.

1byte削ることに意味があるというのも,どうかとは思うけど....

#MaxOS X for Java Geeksの訳本もついに登場のようですね.

-- 
村山敏清 株式会社ネットジーン 〒164-0001 
東京都中野区中野3-33-3 インツ中野ビル 5F
E-mail:murayama@xxxxxxxxxxxxx 
TEL:(03)5328-3670 FAX:(03)5328-3673
http://www.netgene.co.jp/