Case文とIf文

返信する


答えを正確に入力してください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: Case文とIf文

by konisi » 2006年5月23日(火) 21:12

比較対象があれば確認しますが・・・
なんかライタが同じじゃないと少しだけ気になるのでね^^;

まぁ暇なので同等のプログラムを作りつつConsoleモードでのPrint関数がどのくらい処理コストがかかるのかを調べてみました。
数えてみると呼び出し部分だけで50クロックあります。下請けの4030AB番地と402CE0番地のほうは長いのであとで追記という形でクロック数を載せようかと思います。


そういえば、同等のプログラムを書いたら単位処理が重いIf文のほうがクロック数が高くなると思うのですが^^;>>NoWest氏


追記 2006/05/23 21:50
402CE0番地は下請けを含めずに計算すると296クロックでした。また、ここから一度だけ4030AB番地に飛んで、2回401944番地に飛んでいます。ただし401944番地で始まる場所は分岐が多いので最大クロック数と最低クロック数を求めるのに一苦労しそうです。
4030AB番地は下請けを含めずに計算すると338~396クロックです。値が不定なのは掛け算にかかる時間が不定だからです。また、これ以下の下請けはありませんでした。

総クロック数を計算すると、401944番地を計算に含めないなら1360~1534クロックでした。

by NoWest » 2006年5月23日(火) 17:30

> 厳密に調べなおしたら、Case文を使う方は分岐する時のコストが14クロック、If文のときは31クロックでした。また、分岐しない場合の通過処理コストがCase文の場合11クロック、If文の場合は27クロックでした。
中々面白そうな話題ですね。

Select Case文の方が速いって話はよく聞いてましたが、具体的なクロック数は知りませんでしたね。

Select Case文を次のように書き直せばIf文と同じようなクロック数になるんでしょうかね?

コード: 全て選択


Dim a As Long
Input "a=",a
Select Case (a=>0)
    Case -1
        Print "aは自然数である。"
    Case 0
        Print "aは自然数ではない。"
End Select

by konisi » 2006年5月23日(火) 14:22

厳密に調べなおしたら、Case文を使う方は分岐する時のコストが14クロック、If文のときは31クロックでした。また、分岐しない場合の通過処理コストがCase文の場合11クロック、If文の場合は27クロックでした。

ちなみに、空関数を呼ぶときのコストが呼び出し部分で10クロック、内部処理で24クロック、リターン部分で5クロック、合計39クロックでした。

はい、どうでもいい話です。

by MML » 2006年5月21日(日) 18:11

僕は、ifです。
理由は、
僕、スクリプトめちゃめちゃきれいに書きたいので、
コメントを書きまくるんです、、、
ifとは↑関係ありませんが、
なんとなく、ifの方がきれいにかけるので、、、

by みどるべあ » 2006年5月20日(土) 23:29

Caseを主に使ってますね。
ソースの見やすさって結構大事だと思うので、分岐数が2つ以上ならCaseを使ってます。
Ifを使うときには、「If bhoge Then hoge()」くらいですかね…


報告しておきます。
 ・Case:L=963でコンパイラが落ちました(メモリアクセス違反)。
 ・If:L=1371でコンパイラが落ちました(応答無し)。

CPU:Celeron 400MHz
OS:WinXP SP2

分岐限界を調べてみた。

by konisi » 2006年5月20日(土) 22:04

暇だったので調べてみました。 で、結果はL(分岐数)=100の時両方コンパイルが通る、L=1000のときIf文を使った方はコンパイルが通るがCase文を使った方はコンパイルが通らない、L=10000のとき両方ともともにコンパイルが通らない という結果になりました。
さらに調べると、Case文の場合の分岐限界は963個、If文の場合の分岐限界は1370個でした。ただし、If文を使う方がCase文を使うときより1.4倍ほどソースコードが膨れました。また、分岐する数が同じ場合にCase文を使う方がIf文を使うそれよりコンパイル後のファイルサイズが小さくなる事がある事が分かりました。これについては後でじっくり調べたいと思います。ちなみに、コンパイルにかかった時間は同程度でした。

環境によってはCase文やIf文の分岐限界が高い事もありえます。誰か別途報告頼みます。

CPU:Pentium4 3.0GHz
OS:WinXP SP2

追記

Case文とIf文において色々と調べたら分かった事があります。
Case文の場合は最初に全て分岐して、それから動作するので構造は並列っぽいし、予想される動作速度もIf文の2倍程度(メモリへのアクセス回数等から計算)と軽快です。ですがジャンプ先などを全て把握しておかなければならないので分岐数の限界がIf文に劣るものと思います。

これに対してIf文の場合は分岐しながら進み、条件式が真の時に動作を始めるので構造は直列っぽいし、Case文に比べればメモリへのアクセスを頻繁に行うため動作がやや鈍るものと予測します。ただしEndIf文が置かれている場所+αくらいしか把握するべき事柄が無いため、分岐数の限界がCase文に勝るものと思います。

つまり
IfよりCaseの方が実行速度は速くできるけど、If文に比べたらあまり大量に分岐できるわけではないって言うことかな。

by tak » 2006年5月20日(土) 20:42

ElseIf でだらだらとつなぐのは格好悪いので、そういうときは Case を使います。
でもそういうことはほとんどないので、結局 If ですね。C1000 さんと同様です。

ちなみに、一定の条件下では Case のほうが効率がよいことがあります。
AB では Case の検証をしたことないのでわかりませんが。

ところで If について
> かなりの量まで分岐も出来る
> 多くの分岐が簡単にできる
という意見がでていますが、僕はこの意味を理解できていないので、誰か解説をお願いします。

by ゲスト » 2006年5月20日(土) 19:42

僕もIf文ですね。皆さんと同じで、多くの分岐が簡単にできるからです。
自分はIf文の方が圧倒的に勝ると思うんですけど、
それぞれのメリット・デメリットとかあるんですかね。

by C1000 » 2006年5月20日(土) 18:13

自分はIfを使用しています。理由はたくさん分岐することが無いからです。

Re:Case文とIf文

by 彦左衛門 » 2006年5月20日(土) 14:15

こんにちは。

私はIf文を使用しております。

理由は、なんとなく、です。

by konisi » 2006年5月20日(土) 14:11

僕はIfブロックをよりよく使いますね。
理由は、Select文+Caseブロックだと文字列の分岐が出来ないからです。

Ifブロックはかなりの量まで分岐も出来るし、文字列判定も楽なので。

Case文とIf文

by kunio » 2006年5月20日(土) 14:09

皆さんはCase文とIf文のどちらを主に使用されますか?
私はほとんどCase文です。特に理由はないです。
宜しければご意見お聞かせ下さい。

ページトップ