Top  上へ  目次



高性能なソフトの作り方(番外編)



 最近、こんな質問を受けました。

 自分の使い勝手に合うファイラーが無いので、自作しています。
 ですがAs/Rの表示性能に遠く及ばないのですが、どのような実装をすれば良いでしょうか?アドバイスをお願いします。


 高速なアプリケーションの作成の秘訣ねぇ・・・うーん。
 まぁ、ファイラーならリストコンポーネント使うんでしょうから仮想リスト使いなさいねとか、最近のコンパイラは賢いので新しいの買ったら?とか、お手軽なアドバイスはすぐにネタ切れになります。

 チューニングのコツのようなものはありますが、特に魔法とか秘奥義とか必殺技なんてありません。
 ものすごーく地味な作業を積み重ね、実際に試行錯誤を繰り返すことが秘訣と言えるかもしれません。


1.時間がかかっている処理を特定する
 まず正確な時間を計測し、簡単に利用できるカラクリを先に実装しておくと良いでしょう。
 特に時間がかかりそうな処理を行う際には、かかった時間を正確に求めて、どこがボトルネックになってるか調べます。
 ボトルネックが分かれば、特に改善すべき場所は特定できますからね。
 実装が進んでいくと次第に遅くなってくという現象は、人の感覚では慣れもあって気付けないので、数字で管理して客観的なデータを揃える事が重要です。

2.使うAPIは特性を理解し、使用方法を吟味する
 同じような動作をするWindows APIがたくさん存在してますが、その性能と機能は千差万別です。
 例えば文字列を比較する関数なんて、数十個あります。
 例えば、投入していくデータによって性能差が出たりするのですよ。
 そうですねファイル名って半角英数字が多いという傾向があるので、対象環境の特性と分布も考慮して考えると色々な選択ができるんじゃないかと思います。
 慣れてくると、使うべきAPIが自然と判断できるようになります。

3.改善を繰り返すようにする
 何か機能を追加していったりすると、うっかりボトルネックを作っちゃったりするんですよね。
 そうならないように、常にかかった時間を求めてチューニングを「繰り返す」ということが重要です。
 As/Rのステータスエリアで描画にかかった時間を表示してるのは、私がポカやらかさないようにする目的で表示しているものです。

4.複数の実現方法がある場合は、可能な限り全部を実装した上で比較し、最適なものを選択する
 より良いアルゴリズムを「選択」するということですね。
 例えば、サムネイル画像を作るとかだけを取り上げても、何十通りも作り方があるわけで、その特性を吟味して目的にあった実装を行います。
 ちなみに、OSごとに激しい性能差があったりしますので、1度作ったからといって安心してるとクソソフトの烙印を押されます。(経験談)

5.同じ処理を何度も記述しない
 これは「外部ライブラリを含めて」という点を含めるので、さりげにハードルが高いです。
 ライブラリ等で隠蔽されているものにも疑いの目を向ける姿勢は必要です。
 例えば、高機能の描画関数などは、様々な初期化処理が含まれているんですが、チリも積もればすさまじい差がつきます。
 たとえばWindowsの描画は、ほとんどがGDIに対するものですが、このハンドルの取得速度はかなり速いのですがウッカリ内部で取得している高機能APIとか使っちゃいますと、何度も何度も何度も何度も何度も繰り返し呼ぶことになります。
 そういうところに気付けないと、改善できません。

6.計算量の多いロジックは使いどころを工夫する
 意外に思われるかもしれませんが、例えば正規表現などは、すさまじく遅い文字列比較処理になります。
 便利なものであるからこそ、使い方も工夫しないとダメなんですよね。

7.MSDNは原文もあわせて読む
 日本語訳されたものは不正確だったり、情報が欠落している残念なものばっかりなんで、なるべく原文を合わせて読みましょう。
 英語は頑張れ・・・俺も頑張ってる。

8.とりあえず公開する
 片っ端から人の意見を聞いてみるのも、得るものが多いと思います。
 雑談だったり有用な意見でなくても、気付きの元になることもありますし、外部からの刺激って重要です。