stViewerの動作速度改善作業

動機はともあれ、なにかしら急に思い立って、stViewerの動作速度改善作業をやってみた。

ソースの修正ってっても、動作時にクリティカルになってる部分、つまり動作に時間がかかっているところの修正を行いました。もっと具体的にいうなら、ファイルからの読み込み時と検索時ですけどね。もともと、これまでよりも速度を改善するためのロジックをぼんやりイメージしていたので、それを実際にソースに落としてみたというところです。

そしてその結果、検索速度はこれまでの20倍以上(当社比)となり大成功。しかし、ファイル読み込みは逆に遅く(当社比)なってしまいました。ううーーーん、これは意外。プログラマ的直感で絶対に早くなると思ってたのに。。

具体的には以下のような感じです。IOから読み込んだのがbyte[] bufに入っているとして、String[] bodyへ1行ごとにぶった切った文字列を入れていくとします。従来が

String tmp = new String(buf);
for(int i=0; i<100; i++){
 body[i] = tmp.substring( i*20, (i+1)*20);
}
という感じだったのを、
for(int i=0; i<100; i++){
 body[i] = new String( buf, i*20, 20);
}
としてみた、という感じです。つまり、従来は読み込んだbyte[]をいきなりでかいStringに変換してしまいそれからsubstringでちまちま切っていたのを、今回byte[]のまま切れ目を探す処理をしそして1行ごとにnew Stringしてみた、ということです。

これまではsubstringを実行しまくっているせいで無駄なStringのインスタンスを作っていた、その分が省けて実行速度も改善するだろう、と思いこんでいたわけです。ところが、JavaVMのString周りのインスタンス生成におけるメモリ管理がうまいんだろうか、逆に遅くなってしまいました。動作状況から察するに、どうもnew Stringを呼ぶ回数が増えた分ネックになってしまったという感じです。参考までに、公開しているstViewerのソースコードのアーカイブには、「view.java.bak」としてその改変したやつを添付しておきます。

まぁそんなわけで、思い立って行動した時間のうち、ファイル読み込み関連のソース修正(+そのパフォーマンス測定)にかかった時間3時間ちょいが無駄になりました。誰か利子つけて返してください。おながいしまつ。

このブログ記事について

このページは、らるるが2005年8月 4日 04:51に書いたブログ記事です。

ひとつ前のブログ記事は「ついにFTTH開通」です。

次のブログ記事は「第2回TOEIC受験結果」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

月別 アーカイブ

ウェブページ

Powered by Movable Type 7.9.0