ゴミ箱の中のメモ帳

まだ見ぬ息子たちへ綴る手記

コードの効率だとか最適化だとか言う奴は四則演算も高速化しろよ

このブログじゃないブログに以前アホのPHPプログラマの話を書いた。そのプログラマ曰く、「echoとprintではechoの方が早いので通常はechoを、速度を犠牲にしてでもprintの機能が必要なときはprintを使え」とのこと。

アホかと、バカかと、お前は一つのプログラムの中で何百億丁万回文字列を出力するのかと。

以前の記事ではPHPソースコードの比較とベンチマークから確かにechoの方が高速に動作する事を確認した。だがその速度差は、Cソースコード内の関数が受け取る引数がポインタなのかどうなのかとの違いと、戻り値を返すかどうかの違いだけであったかと思う(数年前なのでうろ覚え)。

だが、C言語でその程度の差であれば1万回実行しても目に見えた速度差が起こることではない。コンパイラによる最適化などで考えられる以下の速度差にも改善される。

その程度の速度差のために可読性とメンテナンス性を犠牲にするのであれば、四則演算すらも効率を考えて最適化したコードを書けよと思う話。

Cプログラム高速化研究班 コードを高速化する20の実験と達人の技

Cプログラム高速化研究班 コードを高速化する20の実験と達人の技


いや、全てプログラムでこの速度差を無視するべきという話ではない。実際にテンプレートエンジンではこの速度差によるレスポンスの違いもうまれるかもしれない。

だがそれは「テンプレートエンジン」と言うシステムの都合上、実際に文字列の出力を多量に行うためにその程度の速度差でも改善する必要があるからになる。だがしかし、そいつはプログラミングの講座を行っていた人間で、そもそもC言語を読めるような人間でもない。どこかで聞きかじった知識をひけらしたかっただけになる。

こういったしょうもない効率化や最適化の話はプログラムの書けない、単に知識をひけらかしたい人間の常套句だが、たまに本心からそう発言してくる人間もいる。


だが、そういった「効率化の鬼(バカ)」に言いたいのは、その程度の速度差を気にするのであれば、お前がプログラム中に書いている四則演算も効率化、最適化しろと感じる。

このような発言をしている人間の大半は、文法や関数の選択として多少高速なものを選んでいる程度になり、四則演算まで効率化している人間を見たことがない。C言語であればまだしも、最近はLLの普及もありシフト演算を行っているユーザも見なくなってきた。

もし値を2倍にするのであれば「x<<1」とすればいいし、わり算でも同じようにシフト演算を組み合わせる。足し算や引き算でも値によってはシフト演算との組み合わせで効率化を行える場合もある。

echoやprintと言う関数レベルでの効率化や、条件分岐の最適化など表向きにコードに現れる工夫はしても、四則演算の工夫はされていない。例えばコードによって、printとechoが入り乱れていたら読みづらいし、条件分岐は削れば削るほどわけがわからなくなる(読みやすくなることもあるが)。

そのようにコードを犠牲にしてでも速度を重視するのであれば四則演算の様な低次元やそもそも不要なコードを読み込まないようにインタプリタ自体も環境に応じて修正すべきだ。そしてそのほうが高速化も現れやすい。


確かにプログラムが早く動くことは大事だが、必要以上の高速化は意味がない。開発コストの無駄だ。それよりもメンテナンス性のために多少効率が悪くても読みやすいコードを書くべきだ。コードを書くのは1回だが、コードはその1000倍は読まれる。プログラムの修正を行う際にコードの把握に時間がかかるほうがより時間を無駄にしている。


いやぁ、久しぶりに効率化のアホみたいな話を聞いて思い出したように書いてみる。

パソコン画像処理ハンドブック3―高速汎用画像処理プログラムPIMPOM

パソコン画像処理ハンドブック3―高速汎用画像処理プログラムPIMPOM

ルームランナー グリーンマスター トレッドミルPR210

ルームランナー グリーンマスター トレッドミルPR210

CUDA高速GPUプログラミング入門

CUDA高速GPUプログラミング入門