最適化の責任分解点

「実行速度最適化について考えたこと。」

かつて…。C 言語で開発していた頃は、「こうやった方がレジスタが効率よく使われるから…」そんなことを言いながら、つたないながらも実行速度を重視した実装をしていたことがある。当時のハードウェアスペックでは、実行速度やメモリ効率は大きな課題だったし、それらは競い合うのが簡単だったから、開発していて楽しかったのだ。

ハードウェアスペックが向上し、状況はずいぶん変わった。メモリは潤沢にあるし、1 クロックを削るようなことを目指してコードを書くことは、さして需要ではなくなった (重要な世界もある)。数年前、とても実行効率の良いコードを書く若いエンジニアに、「ここは実行効率よりも、保守性を重視したコードにしてほしい」と言ったこともあるぐらいだ。でも、一方では効率の悪いコードを書くエンジニアに大幅に改善を要求したりもする。実行速度は気にしないのではなかったかと矛盾を感じているかもしれないが、最適化には責任分解点があると思うのだ。ここまではエンジニアの責任で、ここからはコンパイラバーチャルマシンの責任、みたいな。

計算量最小化を目指すのはエンジニアの責任。採用するアルゴリズムを決定するとか、同じ計算や判定を繰り返さないとか、関連する処理はまとめてやっちゃうとか。だけど、そっから先、CPU タイムを削る作業はコンパイラバーチャルマシンの責任として割り切りたい。イテレーターよりも for 文の方が速いから for 文を使うと云ったような判断は、エンジニアの責任範囲外。意味とか意図とか目的とかを明確にして、一貫性のあるコードを書くのがエンジニアの責任だと思うのだ。そうすることで、コードが分離されてゆけば、コンパイラバーチャルマシンや CPU の最適化技術がさらに進むんぢゃないかな? いろいろな状況に対応するのは難しいけど、特性に偏りが出れば最適化はできるはずだから。

「エンジニアは計算量最小化を、コンパイラバーチャルマシン、CPU は CPU タイム最小化を目指す。」

…風呂に入って考えてた時は、この説明で言いたいことを表現できていると思ってたんだが、書いてると境界の分離が十分伝わらない気がして来た。全体最適化がエンジニアの責任で、部分最適化がコンピュータの責任…。まあ、言いたいのはそんなところなんだけれども…。

既に誰かが分かりやすく書いておられることを期待しよう。