プログラムの高速化手法を再度学習する
- 「プログラムの高速化の指針をお持ちですか」
- 「プログラムの高速化で参考になる情報をお持ちですか」
と聞かれたらどうしよう。
ぱっと思いつくのは、日本でDELPHIの時代を切り開いた一人である
黒田Dycoonさんのページ「プログラムの技」です。
最初に見たのが7年前くらい。当時は「よく分からないからすごい」というぐらいでした。
今見返してみるとSimple Faster - Case分の高速化がとても興味深いです。実験では、分岐処理をcase、if、procedure配列の三つの方法で実装して比較しています。結果として、procedure配列による方法が一番高速で、分岐数にも左右されない、ということのようです。case、ifが遅くなる原因を次のように予測しています。
遅くなる原因は、よくはわかりませんが、分岐予測を失敗してそのために
遅くなっているのではと、推測しています。
分岐予測そのものは分かりませんが、
- 分岐予測という機能があり、うまくそれを活用することで高速化される
- 「分岐させる」ということにもコストがかかる
- 分岐は少ない方がコストがかからない
- 分岐させないのが一番いい
ということは分かります。分岐予測による高速化について理解するには、
- 分岐予測とは何か
- 分岐予測をさせるにはどうすればいいか
を知る必要があります。
分岐予測、といえば清水さん(Shi3zさん)の記事で見かけて以来、意識するようになりました。
パイプライン処理、スーパースカラー、分岐予測、遅延分岐スロット、ループ展開、テーブル処理…かつて10万分の1秒を争っていた頃、嫌と言うほど意識したコンピュータの基本中の基本の考え方です。
恥ずかしながら、スーパースカラー、分岐予測、遅延分岐スロットは全く想像がつきませんでした。調べてみても、用語辞典ではどれもピンと来ませんでした。
・・・朝一で調べるには少しきついので、じっくり取り組んでみよう。