ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2024年3月28日(木) 18:25

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




新しいトピックを投稿する  トピックへ返信する  [ 12 件の記事 ] 
作成者 メッセージ
 記事の件名: Case文とIf文
投稿記事Posted: 2006年5月20日(土) 14:09 
皆さんはCase文とIf文のどちらを主に使用されますか?
私はほとんどCase文です。特に理由はないです。
宜しければご意見お聞かせ下さい。


通報する
ページトップ
   
 記事の件名:
投稿記事Posted: 2006年5月20日(土) 14:11 
オフライン

登録日時: 2005年7月25日(月) 13:27
記事: 893
お住まい: 埼玉県東松山市
僕はIfブロックをよりよく使いますね。
理由は、Select文+Caseブロックだと文字列の分岐が出来ないからです。

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

_________________
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。

に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。


通報する
ページトップ
 記事の件名: Re:Case文とIf文
投稿記事Posted: 2006年5月20日(土) 14:15 
こんにちは。

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

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


通報する
ページトップ
   
 記事の件名:
投稿記事Posted: 2006年5月20日(土) 18:13 
オフライン

登録日時: 2006年5月07日(日) 17:16
記事: 185
お住まい: 宮城県
自分はIfを使用しています。理由はたくさん分岐することが無いからです。


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2006年5月20日(土) 19:42 
僕もIf文ですね。皆さんと同じで、多くの分岐が簡単にできるからです。
自分はIf文の方が圧倒的に勝ると思うんですけど、
それぞれのメリット・デメリットとかあるんですかね。


通報する
ページトップ
   
 記事の件名:
投稿記事Posted: 2006年5月20日(土) 20:42 
オフライン

登録日時: 2005年5月31日(火) 07:49
記事: 162
ElseIf でだらだらとつなぐのは格好悪いので、そういうときは Case を使います。
でもそういうことはほとんどないので、結局 If ですね。C1000 さんと同様です。

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

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


通報する
ページトップ
投稿記事Posted: 2006年5月20日(土) 22:04 
オフライン

登録日時: 2005年7月25日(月) 13:27
記事: 893
お住まい: 埼玉県東松山市
暇だったので調べてみました。 で、結果は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文に比べたらあまり大量に分岐できるわけではないって言うことかな。

_________________
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。

に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2006年5月20日(土) 23:29 
オフライン

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


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

CPU:Celeron 400MHz
OS:WinXP SP2

_________________
みどるべあ
HP:http://hp.vector.co.jp/authors/VA041827/
Mail:middlebear@gmail.com


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2006年5月21日(日) 18:11 
オフライン

登録日時: 2006年5月02日(火) 16:27
記事: 154
僕は、ifです。
理由は、
僕、スクリプトめちゃめちゃきれいに書きたいので、
コメントを書きまくるんです、、、
ifとは↑関係ありませんが、
なんとなく、ifの方がきれいにかけるので、、、


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2006年5月23日(火) 14:22 
オフライン

登録日時: 2005年7月25日(月) 13:27
記事: 893
お住まい: 埼玉県東松山市
厳密に調べなおしたら、Case文を使う方は分岐する時のコストが14クロック、If文のときは31クロックでした。また、分岐しない場合の通過処理コストがCase文の場合11クロック、If文の場合は27クロックでした。

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

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

_________________
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。

に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2006年5月23日(火) 17:30 
オフライン

登録日時: 2005年5月31日(火) 10:52
記事: 264
お住まい: 高知
引用:
> 厳密に調べなおしたら、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日(火) 21:12 
オフライン

登録日時: 2005年7月25日(月) 13:27
記事: 893
お住まい: 埼玉県東松山市
比較対象があれば確認しますが・・・
なんかライタが同じじゃないと少しだけ気になるのでね^^;

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


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


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

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

_________________
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。

に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。


通報する
ページトップ
期間内表示:  ソート  
新しいトピックを投稿する  トピックへ返信する  [ 12 件の記事 ] 

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


オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[11人]


トピック投稿:  可
返信投稿:  可
記事編集: 不可
記事削除: 不可
ファイル添付: 不可

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