プログラムの高速化手法を再度学習する

  • 「プログラムの高速化の指針をお持ちですか」
  • 「プログラムの高速化で参考になる情報をお持ちですか」

と聞かれたらどうしよう。

ぱっと思いつくのは、日本でDELPHIの時代を切り開いた一人である
黒田Dycoonさんのページ「プログラムの技」です。

最初に見たのが7年前くらい。当時は「よく分からないからすごい」というぐらいでした。
今見返してみるとSimple Faster - Case分の高速化がとても興味深いです。実験では、分岐処理をcase、if、procedure配列の三つの方法で実装して比較しています。結果として、procedure配列による方法が一番高速で、分岐数にも左右されない、ということのようです。case、ifが遅くなる原因を次のように予測しています。

遅くなる原因は、よくはわかりませんが、分岐予測を失敗してそのために
遅くなっているのではと、推測しています。

分岐予測そのものは分かりませんが、

  • 分岐予測という機能があり、うまくそれを活用することで高速化される
  • 「分岐させる」ということにもコストがかかる
  • 分岐は少ない方がコストがかからない
  • 分岐させないのが一番いい

ということは分かります。分岐予測による高速化について理解するには、

  • 分岐予測とは何か
  • 分岐予測をさせるにはどうすればいいか

を知る必要があります。

分岐予測、といえば清水さん(Shi3zさん)の記事で見かけて以来、意識するようになりました。

パイプライン処理、スーパースカラー、分岐予測、遅延分岐スロット、ループ展開、テーブル処理…かつて10万分の1秒を争っていた頃、嫌と言うほど意識したコンピュータの基本中の基本の考え方です。

恥ずかしながら、スーパースカラー、分岐予測、遅延分岐スロットは全く想像がつきませんでした。調べてみても、用語辞典ではどれもピンと来ませんでした。

・・・朝一で調べるには少しきついので、じっくり取り組んでみよう。