2005/11/17(木) [n年前の日記]
#2 [prog] if と switch - case
_「内部的にはbool値の組み合わせで設定」
という一文を読んで、ふと。もしかしてフラグで管理するよりは選択肢で管理するほうが処理が速かったりしないか、てなことをぼんやり思ったり。
if ( flag1 ) { ... } if ( flag2 ) { ... } if ( flag3 ) { ... } if ( flag4 ) { ... }よりは、
switch ( n ) { case 0: ... break; case 1: ... break; case 2: ... break; case 3: ... break; }のほうが条件分岐が1回で済みそうな、とここまで書いたところで気がついた。switch - case って結局は、
if ( n == 0 ) { ... } else if ( n == 1 ) { ... } else if ( n == 2 ) { ... } else if ( n == 3 ) { ... }になってしまうのではないか。としたら条件分岐の数は変わらない。つまり、速度的なメリットはないだろうと。アホだ。>自分。
◎ どうしてこんなアホなことをつい思ってしまったかというと :
条件分岐を使わない switch - case も、かつて、世の中にはあったからで。<過去形。アセンブラで組んでたときにやってたけど、テーブルを使って…。
条件分岐が入らないから、CPUの命令クロックを数えると多少は速かったりするのかしら。わからんけど。 *1 …クロック数を稼げると言っても微々たるものだけど、その処理が何十回も繰り返されれば結構違ってくるわけで。昔のCPUはそんなに速くなかったというのもあるし。
今となっては使う意味がないよなぁ。10年〜15年前、X68Kで動いてたコンパイラあたりでも、そのへん判断して適切なバイナリを作ってくれる・最適化してくれる等を聞いたような記憶もあったりするし。人間がわざわざCPUのつもりになって書く必要性なんてない。CPUの動作も今と昔では違うし。1命令1クロックとか当たり前で同時にいくつもの命令が走ってたりするんだろうし。こんなやり方を要求される場面なんてもはや存在しないわな。
と思ったが、例えば、100種類ぐらいの敵処理をメインループから呼び分けないといかん、てな場面では必要になったりもするのかしら。速度的なメリットではなく、管理する上でのメリットだろうけど。処理をする関数のアドレスをテーブルに列挙していくだけで済むだろうし。…まあ、そのへんよくわからんのだけど。
void (*adrs[])() = { job0, job1, job2, job3 }; (*adrs[n])();Cの書き方は忘れちゃったので、こんな感じの記述で合ってるのかわかんないけど。
条件分岐が入らないから、CPUの命令クロックを数えると多少は速かったりするのかしら。わからんけど。 *1 …クロック数を稼げると言っても微々たるものだけど、その処理が何十回も繰り返されれば結構違ってくるわけで。昔のCPUはそんなに速くなかったというのもあるし。
今となっては使う意味がないよなぁ。10年〜15年前、X68Kで動いてたコンパイラあたりでも、そのへん判断して適切なバイナリを作ってくれる・最適化してくれる等を聞いたような記憶もあったりするし。人間がわざわざCPUのつもりになって書く必要性なんてない。CPUの動作も今と昔では違うし。1命令1クロックとか当たり前で同時にいくつもの命令が走ってたりするんだろうし。こんなやり方を要求される場面なんてもはや存在しないわな。
と思ったが、例えば、100種類ぐらいの敵処理をメインループから呼び分けないといかん、てな場面では必要になったりもするのかしら。速度的なメリットではなく、管理する上でのメリットだろうけど。処理をする関数のアドレスをテーブルに列挙していくだけで済むだろうし。…まあ、そのへんよくわからんのだけど。
*1: シフト+メモリリード+ジャンプ命令のクロック数が、条件分岐命令のクロック数より少なければ、とか?
この記事へのツッコミ
[ ツッコミを読む(4) | ツッコむ ]
以上です。
私もソレ、聞いたことがあります。
昔の Oh! X とかでもgcc絡みで載ってたような… <記憶違いかもしれず。
ただ、言語、というか、コンパイラというか、インタプリタというか、
あるいは最適化オプションによっては、違ってきそうではありますね。
gccはやってくれそうだけど、
Perl、Ruby、Python等のLLはどうなのかとか、
javaはそのへんちゃんとやってくれてるのか、とか…よーわからんです。
http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/410695
で例外を使ってswitch caseを実現したり
http://simon.incutio.com/archive/2004/05/07/switch
でいろいろな方法のコメントがついていたりします。(if文で書くのがいちばんPythonっぽい気が)
知らなかった…!
紹介されたページなり、関連ページを検索したりしましたが、
なるほど、プログラマー自身が処理のやり方を選べる・意識できるあたり、
(ジャンプテーブルにするか、if の羅列にするか等)
ちょっとメリットっぽい感じもしました。
各言語のポリシー(?)って、面白いなぁ…。