ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2024年4月28日(日) 03:58

全ての表示時間は UTC+09:00 です




返信する
ユーザー名:
件名:
メッセージ本文:
メッセージを入力してください。60000 字まで入力できます。 

フォントサイズ:
フォントカラー
オプション:
BBCode: ON
[img]: ON
[flash]: OFF
[url]: ON
スマイリー: OFF
BBCode を無効にする
URL を自動的にパースしない
クイズ
お手数ですがカタカナで「エービー」と4文字を入力してください。:
答えを正確に入力してください。答えられるかどうかでスパムボットか否かを判定します。
   

トピックのレビュー - Case文とIf文
作成者 メッセージ
  記事の件名:   引用付きで返信する
比較対象があれば確認しますが・・・
なんかライタが同じじゃないと少しだけ気になるのでね^^;

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


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


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

総クロック数を計算すると、401944番地を計算に含めないなら1360~1534クロックでした。
投稿記事 Posted: 2006年5月23日(火) 21:12
  記事の件名:   引用付きで返信する
引用:
> 厳密に調べなおしたら、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
投稿記事 Posted: 2006年5月23日(火) 17:30
  記事の件名:   引用付きで返信する
厳密に調べなおしたら、Case文を使う方は分岐する時のコストが14クロック、If文のときは31クロックでした。また、分岐しない場合の通過処理コストがCase文の場合11クロック、If文の場合は27クロックでした。

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

はい、どうでもいい話です。
投稿記事 Posted: 2006年5月23日(火) 14:22
  記事の件名:   引用付きで返信する
僕は、ifです。
理由は、
僕、スクリプトめちゃめちゃきれいに書きたいので、
コメントを書きまくるんです、、、
ifとは↑関係ありませんが、
なんとなく、ifの方がきれいにかけるので、、、
投稿記事 Posted: 2006年5月21日(日) 18:11
  記事の件名:   引用付きで返信する
Caseを主に使ってますね。
ソースの見やすさって結構大事だと思うので、分岐数が2つ以上ならCaseを使ってます。
Ifを使うときには、「If bhoge Then hoge()」くらいですかね…


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

CPU:Celeron 400MHz
OS:WinXP SP2
投稿記事 Posted: 2006年5月20日(土) 23:29
  記事の件名:  分岐限界を調べてみた。  引用付きで返信する
暇だったので調べてみました。 で、結果は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文に比べたらあまり大量に分岐できるわけではないって言うことかな。
投稿記事 Posted: 2006年5月20日(土) 22:04
  記事の件名:   引用付きで返信する
ElseIf でだらだらとつなぐのは格好悪いので、そういうときは Case を使います。
でもそういうことはほとんどないので、結局 If ですね。C1000 さんと同様です。

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

ところで If について
> かなりの量まで分岐も出来る
> 多くの分岐が簡単にできる
という意見がでていますが、僕はこの意味を理解できていないので、誰か解説をお願いします。
投稿記事 Posted: 2006年5月20日(土) 20:42
  記事の件名:   引用付きで返信する
僕もIf文ですね。皆さんと同じで、多くの分岐が簡単にできるからです。
自分はIf文の方が圧倒的に勝ると思うんですけど、
それぞれのメリット・デメリットとかあるんですかね。
投稿記事 Posted: 2006年5月20日(土) 19:42
  記事の件名:   引用付きで返信する
自分はIfを使用しています。理由はたくさん分岐することが無いからです。
投稿記事 Posted: 2006年5月20日(土) 18:13
  記事の件名:  Re:Case文とIf文  引用付きで返信する
こんにちは。

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

理由は、なんとなく、です。
投稿記事 Posted: 2006年5月20日(土) 14:15
  記事の件名:   引用付きで返信する
僕はIfブロックをよりよく使いますね。
理由は、Select文+Caseブロックだと文字列の分岐が出来ないからです。

Ifブロックはかなりの量まで分岐も出来るし、文字列判定も楽なので。
投稿記事 Posted: 2006年5月20日(土) 14:11
  記事の件名:  Case文とIf文  引用付きで返信する
皆さんはCase文とIf文のどちらを主に使用されますか?
私はほとんどCase文です。特に理由はないです。
宜しければご意見お聞かせ下さい。
投稿記事 Posted: 2006年5月20日(土) 14:09

全ての表示時間は UTC+09:00 です


ページ移動:  
Powered by phpBB® Forum Software © phpBB Limited
Japanese translation principally by ocean