プロファイリング重要

Javaで書いているネットワークプログラミングの仕事もいよいよ佳境だ。実装と機能テストは既に完了しているが、レスポンス要求の厳しい部分のため、現在はチューニングを行なっている。「チューニングは正しく計測してから」に則り、まずはプロファイリングを行なうのだが、効率良く計測を行なうにはツールが必要になってくる。最近はEclipseのプラグインを含めて良いプロファイラがたくさんあるようだが、私はIDEに統合されていないプロファイラのほうが好きだ。好みの問題だろうが、私はIDEの動作やバージョンに依存するプラグインタイプのプロファイラは使いづらい。独立し、単独で起動して自身のJVMか他のJVMにJPDA経由でアタッチできるプロファイラが良いと思う。(矛盾する話になるが、あまりにEclipseに依存すると、将来に渡って特定のバージョンのEclipseとそのプラグインに頼らなくてはならない、というよくあるケースに陥りたくない、ということもある。)


私はJava2になってからずっとOptimizeItというプロファイラを使用している。現在はversion 5.0という製品だ。(OptimizeItは元々シェアウェアの頃から使っているが、現在はBorlandがソフトウェアを買い取り、いろいろと機能を付加して、Enterprise Suiteとして販売している)プロファイラはその機構上、JVMの作りにどうしても依存するのだが、このプロファイラは最近のJava2のJVMであれば殆どのJVMに対応しており、私が使用しているversion "1.4.2_09"でもきちんと動いてくれるのは有り難い。今のバージョンは、恐らくはJ2SE5.0では動作しないだろうが、それが私がJ2SE5.0に移行できない理由でもある。Java、.NET問わず商用のプロファイラは高価であり、おいそれと購入できないのだ。

OptimizeItはプロファイリングとしては基本的な計測(CPU,GC,メモリ,処理時間、カウント)を行なうことが出来、それでいて、比較的動作が軽いのがとても気に入っている。また、計測の結果を簡易にHTMLにエクスポートできるので、後で性能計測の結果をまとめるのにも便利だ。(スクリーンショットだらけのドキュメントはあまり綺麗ではない)


これは、私が書いているプログラムのテストスタブを実行する際に、OptimizeItによって実行時プロファリングをした結果である。内容としては、ネットワークからデータを受けた後、トランザクションとしてデータをオブジェクトにデシリアライズするまでの動作であるが、このようにどのクラスのどのメソッドでどれだけの時間を消費しているのかが一目で解るので、性能上の問題点を洗い出すのに役に立つ。(クラス名は大人の理由で適当に変えてある)

最近はすっかりXP(eXtreamPrograming)で有名になってしまった感のある、20:80の法則だが、ソフトウェアでは元々チューニングの世界での理としても定着している法則だ。この計測結果でもそうだが、性能上の問題の80%は20%の場所で生じている。その部分(性能上のホットスポット)を改善することで、最も効率的に成果を上げることができる。ということなのだが、雑誌等に書いているように、この法則通りに、すぐに解るとは限らない。あくまで「傾向」であり、実際の所はやはり技術者が詰めていかなくてはならないのだ。
OptimizeItはホットスポットと思われる箇所に、親切にも赤い時計のアイコンを付けてくれる。必ずしも正しいとは限らないので注意が必要だが、今回の例だと改善の余地があるのは、正しくhoge.PeerImpl.getTransaction()メソッド以下の箇所だと思われるので、今回は正しかったようだ。