top / index / prev / next / target / source
日記形式でつづる いがぴょんコラム ウェブページです。
J2SE 1.3.1_01aにアップグレード , 別件ですが、HotSpotの 予想以上の最適化機能に驚く…
1.3.1_01 を使っていたのを 1.3.1_01aに乗り換えてみました。スループット周りの強化とか コンソール画面のメモリリークバグ修正 (嫌な内容です)とかに惹かれて 使い始めました。… 特に問題は出ていません。そこそこ気に入り始めました。
気になった点は、セットアップに従っていってインストールすると IEのJavaVMを置き換えるという 画期的な機能が付属している事です。これは便利 (笑) これで 古くて使い物にならない Microsoft製 JavaVMを 『簡単に』最新版 JavaVMに置き換えることが可能になります。(IEの詳細設定タブに統合されている点も結構気に入りました) …ただし これにより JavaVMの起動速度は低下してしまう模様です。Javaアプレット搭載ページを開くとタスクトレイ右下に コーヒーカップアイコンが表示されます。これの起動に ちと時間がかかっている模様。NetscapeでJavaVM起動するときと同じ挙動です。もっと気になったのは Javaアプレットなページを複数のIEで開くと その数だけコーヒーカップアイコンが追加されて表示される点です。こ…これは どういう意味なんだろう。タスクマネージャで見ると IEって 窓の数だけプロセスが起動されるんですね。今 初めて知りました。なるほどそして その数だけ JavaVMもロードされる模様です。(ただし プロセスとしては IEの中というカウントである模様) これは メモリ搭載量の少ないパソコンでIEを使っている環境において JavaVM更新をかけると、ひどいことが起こりかねないという事を意味しています。古くて使い物にならないJavaVMを最新の版で置き換える事そのものは 大変素晴らしいことなのですけれども、副作用が起きないよう注意することも肝要ですね。
いわゆるデバッグ用コードの実行速度を計測するために 下記のようなコードを書いてみました。 Windows 2000上で SUN Java2 SDK SE 1.3.1_01a 国際化版 (J2SE 1.3.1_01a) で HotSpotありで実行しました。ところがどっこい、あんまり差異が出ません。これが HotSpotの実力か?
/**
* 速度計測サンプル
*/
public class Sample
{
public static final int LOOP_COUNT=100000000;
public static void main(String[] args)
{
new Sample().process();
}
protected void process()
{
System.out.println("いわゆるデバッグ用コードの実行速度計測.");
long lStart=System.currentTimeMillis();
for(int iLoop=0;iLoop<LOOP_COUNT;iLoop++)
{
// ここを変更する。
// 計測数値は Celleron 300MHz
//sample1();//4.547秒
//sample2();//4.707秒
//sample3();//4.567秒
//sample4();//4.747秒
//sample5();//4.717秒
//sample6();//4.747秒
sample7();//8.121秒
}
long lEnd=System.currentTimeMillis();
java.text.DecimalFormat decFormat=new java.text.DecimalFormat("#,##0.000");
System.out.println(decFormat.format(((double)lEnd-lStart)/1000)+"秒");
}
/**
* 全くのコメント
*/
public void sample1()
{
// System.out.println("なにかデバッグ文字列");
}
public void sample2()
{
if(false)System.out.println("なにかデバッグ文字列");
}
public static final boolean IS_DEBUG3=false;
public void sample3()
{
if(IS_DEBUG3)System.out.println("なにかデバッグ文字列");
}
public boolean IS_DEBUG4=false;
public void sample4()
{
if(IS_DEBUG4)System.out.println("なにかデバッグ文字列");
}
public boolean IS_DEBUG5=false;
private boolean getIsDebug5()
{
return IS_DEBUG5;
}
public void sample5()
{
if(getIsDebug5())System.out.println("なにかデバッグ文字列");
}
public boolean IS_DEBUG6=false;
private boolean getIsDebug6()
{
return IS_DEBUG6;
}
public void sample6()
{
if(getIsDebug6())System.out.println("なにか"+"デバッグ"+"文字列");
}
public boolean IS_DEBUG7=false;
private boolean getIsDebug7()
{
return IS_DEBUG7;
}
public void debug7(String strMsg)
{
if(getIsDebug7())System.out.println(strMsg);
}
public void sample7()
{
debug7("なにか"+"デバッグ"+"文字列");
}
}
HotSpot最適化範囲がここまでとは思えませんが…。なぜなのだろう。 *.class(バイトコード)を逆アセンブルしてみようかとも思いましたが、とりあえず時間が無いのとどれが気の利いた バイトコード・リバースツールかを知らないので、とりあえず割愛しました。愛用バイトコード・リバースツールなどありましたら、どなたか一言 ツッコミを入れて下さい。
21:30 ループの回数が根本的に少なすぎたという事に気づきました。ループ回数を大幅アップしました。そうすると 多少特徴が出てきました。なるほど、感慨深い数値だなぁ。(sample7以外はほとんど同数値なんです。意外だったです。)
2001/11/16 結城浩さまから誤植ツッコミSubject: typo結城です。取り急ぎtypoです。 s/パーフォマンスネタ/パフォーマンス/ s/かつで飛ぶ取り落とす/かつて飛ぶ鳥落とす/ s/是非 共通かに/是非 共通化に/
----結城浩
ここからいがぴょんどうもありがとうございます。大変嬉しいです。さっそく修正いたしました。それにしても 沢山間違え過ぎだなぁ (苦笑)