• ベストアンサー

条件分岐 if(elseif) switchの実行速度

条件分岐に if switchがありますが、 ifパターン ============================== if ( $a = 1) {   処理A } elseif ($a = 2) {   処理B } ============================== switchパターン ============================== switch($a){ case '1':   処理A break; case '2':   処理B break; } ============================== 実際はもっと複雑ですが、どちらのほうが実行速度が速いのでしょうか。

  • PHP
  • 回答数2
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
noname#15164
noname#15164
回答No.1

プログラムや、挙動や仕様については分かりませんが、実際やってみました。 処理内容を個別に10000回ループさせて、時間を計るだけですが。 こういう細かい事にこだわっているHPもありますので、探してみてはどうですか? 似たような処理、forとwhileでどっちが早いかとか、から始まって、アルゴリズム研究まで。 乱数使って、乱数によりけりで値を変えてますが、10000回もすれば偏りも減るでしょう。 $start = microtime(); for($i=0;$i<10000;$i++){ $ransuu = rand(0,9); //3パターン //ifだけの場合 //if-elseifを使う場合 //switch-caseを使う場合 } //差を計算 $end = microtime(); $sa = $end - $start; $sa = $sa*10000; printf("%05d",$sa); 結果は、 3位 if文だけ。 2位 switch-case 1位 if-elseif-else 私は、if-elseifだと見にくくなるので、冒頭ではswitch-caseを使う事にしてます。なんかかっこいいし。(w 1位は3位の処理時間で、2倍違うけど、2.8GのCPUで150マイクロ秒しか違わない。 マイクロ秒=100万分の1秒らしい。

realforce
質問者

お礼

150マイクロ秒の違いですか、自分の扱いやすいスタイルでコーディングしたほうがよさそうですね。 有難うございました。

その他の回答 (1)

  • satoh
  • ベストアンサー率77% (17/22)
回答No.2

これ以外にもwhile文とdo~while文なんかもありますけど、過去にいろいろ試したことがあるのですが、PHPのバージョンや環境(OSやらZend Optimizerやら)によって全然違ってきてしまいます。 なので、速度は気にせず見やすい書き方をした方がよいと思います。

関連するQ&A

  • switchでの条件分岐の書き方を教えて下さい。

    こんにちは。 いつもお世話になっております。 またわからない事が出てきてしまったので、どうか ご指導よろしくお願いいたします。 簡単な検索機能をつくりたくて、思考錯誤 しております。 フォームからPOSTで受け取る変数の数は 10個あります。 それぞれの変数が ””でなければ、受け取った 変数を元に、SQL文がかわってゆく。 という事がしたいのです。 10個もあるので、たとえば 変数が$_POST["a"]から$_POST["j"]まであった時に if文を使うとすると if($_POST["a"] != "" && $_POST["b"] == "" && $_POST["c"] != "" (略)){ $stt = "検索したい予定のSQL文1"; }elseif($_POST["a"] == "" && $_POST["b"] != "" && $_POST["c"] != "" (略)){ $stt = "SQL文2"; ・ ・ ・ と言う風に、ものすごいにはなると思うのですがifを つなげていけば良いのかな、と思うのです。 PHPの基礎HPなどを検索してみると、SWITCHを 使えば、多岐に分岐するIF文を、見やすくできる、 と書いてあったので、使ってみたいのですが、書き方の 説明によると switch(変数){ case 値1:  条件を満たす時の処理1 break; case 値2:  条件を満たす時の処理2 default: } と紹介してあったのですが、今回わたしがしたい場合の 条件分岐だと、変数は一つではなく、ある変数は空でこの変数は値が何か入っていて、またもう一つの変数は 空で・・・の時は、このSQL文、というように させたい場合には、switchでどうかけばよいのか わからないのです。 それとも、こういう条件分岐の場合は、switchを 使うべきではないのでしょうか・・・? どうかご指導よろしくお願いいたします。  

    • ベストアンサー
    • PHP
  • 条件分岐(if)について

    条件分岐(if)についてお聞きしたことがあります。 例えば if($a == 'A' || $a == 'B'){ 処理 }else if($a == 'C' || $a == 'D' || $a == 'E'){ 処理 }............... といった条件分岐があったとて、お聞きしたいことが2点あります。 ・条件分岐この後も数十個続いたとします。その場合もelse ifで一つ一つ 条件を書かなければならないのでしょうか? ・条件式if($a == 'A' || $a == 'B'....)が長くなる場合プログラムが見にくくなるので 別途に条件式を書いておいてif文の所では($a == ◯)といったように簡潔に書くことは できないのでしょうか? 宜しくお願いします。

    • ベストアンサー
    • PHP
  • (if/elseif)と(switch文)の使い分け方

    プログラミング初心者です。 switch文がある事を最近知りました。 条件分岐をする時は主にif文を使用してきましたが、switch文とはどのように使い分けるものなのでしょうか。 こんな質問で申し訳ありませんが、よろしくお願いします。

    • ベストアンサー
    • PHP
  • Excel VBA 条件分岐のスマートな書き方

    すみません。すごく初歩的な質問なのですが、 Excel VBAで以下のような条件分岐をさせたい場合、 もっとスマートな書き方できませんか? 命題 AとBに対して if not A then 処理X end if if not B then 処理Y end if if not(A and B) then 処理Z(この処理の中には処理Xと処理Yの結果が含まれている) end elseifを使った書き方が思い浮かばず、 同じことを何度も書いているようで、もっと上手に書けそうな気がしまして・・・ どなたかご教示頂けたらと思います。

  • 条件分岐をデータベースに登録する方法

    現在Case文(if文)でプログラム上で条件分岐をしている作業があります。 たとえば、とある会社からの入金条件が if sales < 100000 then A Elseif sales >= 100000 And sales< 200000 then B Elseif sales >= 200000 And sales< 300000 then C Elseif sales >= 300000 then D という文があり、新しく取引先が増えたら会社ごとにif文を作っていました。 今後、取引先が増えた場合に毎回プログラムをいじるのは問題があるので、 会社毎の条件をデータベースに入力してプログラムをいじらなくても、 ソフト側で登録できるように、と考えているのですが、 どのような形でデータベース化すればいいか見当が付きません。 データベースに数値の範囲を登録? どのようにこの条件を分解して登録するか、またsalesから適切なABCDの処理を ひっぱってくるにはどうすればいいか、よろしければご教授ください。 よろしくお願いいたします。

  • 条件分岐の書き方・・・

    まだプログラミングをはじめて間もない者です。 私は、単純な条件によって処理を分岐させる場合、 たとえば、 if (!empty($hogehoge)): //処理 endif; と書かないで if (empty($hogehoge)): return; endif; //処理 のように、条件に当てはまらない場合、先に返してしまい、 その後に処理を書くようにしています。 理由は、入れ子がどんどん複雑になってしまうのをさけるためなのですが、 熟練したプログラマーの方から見て、 このようなコーディングはどうなのでしょうか? ぜひご指導お願いします。

    • ベストアンサー
    • PHP
  • IFとか条件分岐するSELECT文

    IFとか条件分岐するSELECT文 mytableというテーブルを設け、好きな家電メーカーを3つ挙げてもらい、kaisya1、kaisya2、kaisya3にInsertしました。 また、3つのうち、一番好きなメーカーを社名フラグ(kaisyaFlg;0か1か2で)にInsertしました。 これらの4フィールドを参照し、「一番好きなメーカーリスト」を出すselect文をご教示ください。 PHP側でやるなら、こうなるのでしょうが、MySQL側で「スマートに(?)」処理できないでしょうか。 if ($kaisyaFlg = 0) { $kaisya = $kaisya1; } elseif ($kaisyaFlg = 1) { $kaisya = $kaisya2; } elseif ($kaisyaFlg = 2) { $kaisya = $kaisya3; } echo "一番好きなメーカーは、" . $kaisya;

    • ベストアンサー
    • MySQL
  • IFで条件を分岐させてのINSERT(ストアド)。

    SQL Server2005環境です。 ストアドプロシージャを作成しています。 テーブルAを読み込んで、その値を元に、テーブルBに値を INSERTしていくという処理をしたいと考えています。 1.テーブルA.区分1<>0の時、テーブルB.区分は1 2.テーブルA.区分2<>0の時、テーブルB.区分は2 3.テーブルA.区分1<>0 かつ テーブルA.区分2<>0であれば、  テーブルB.区分が1のレコードと、2のレコード、2つ作る 以上のような処理をしたいと考えています。 ストアドはまったく初心者なのですが、分岐については、 DECLARE TEST CURSOR FOR SELECT 区分1, 区分2 FROM テーブルA OPEN TEST FETCH NEXT FROM TEST INTO @KBN1, @KBN2 --条件分岐 IF KBN1<>0 BEGIN @INKBN=1 END IF KBN2<>0 @INKBN=2 END WHILE @@FETCH_STATUS = 0 BEGIN INSERT INTO テーブルB(区分) VALUES(@INKBN) こんな感じになるのか?と思っているのですが、これではケース3の、 区分1、2ともに0ではない場合の処理ができません。 このような場合、どのように記述すれば目的の処理を達成できるのか 教えていただけないでしょうか? よろしくお願いします。

  • switchの大量分岐の高速化

    いつもお世話になっております。 phpにて、文中にキーワードがあるかどうか判定し、そのキーワードによって処理を変えていくというプログラムを作成しています。 preg_matchまたはstrposによるキーワード判定と、switchによる処理を組み合わせたものです。 //判定対象となる文章 $text = "判定対象となる文章"; //判定キーワードの設定 $word1 = "/キーワード1|きーわーど1|keyword1/"; $word2 = "/キーワード2|きーわーど2|keyword2/"; . .(中略) . $word30 = "/キーワード30|きーわーど30|keyword30/"; //判定処理 switch (true) { case preg_match($word1, $text): echo "キーワード1に該当します" break; case preg_match($word2, $text): echo "キーワード2に該当します" break; . .(大量のcase) . case preg_match($word30, $text) && preg_match($word1, $text): echo "キーワード1かつキーワード30に該当します" break; }; ざっと書くとこのような構造になっています。 しかしキーワード分岐がかなり多岐に渡っている状態で、switch文の後半のcaseに該当する場合になってくると速度もかなり遅く感じます。 どうにかもう少し高速化したいなあと考えているのですが、何か良い方法はありますでしょうか? よろしくお願い致します。

    • ベストアンサー
    • PHP
  • switchの中にIF分の条件分岐について

    int lot2 = Integer.valueOf(年金コード).intValue(); switch (lot2) { case 1: if( (制度コード.compareTo("08")==0) || (制度コード.compareTo("09")==0) && 旧共済退職年金減額該当表示.compareTo("0")==0 ){ out.print("退職  ");break;} case 2: if( (制度コード.compareTo("08")==0) || (制度コード.compareTo("09")==0)){ out.print ("通算退職");break;} 上記のコードは 年金コードが1の場合 制度コード8なおかつ9または旧共済退職年金減額該当表示が0のとき"退職  "を表示 年金コードが2の場合 制度コード8なおかつ9のとき"通算退職"を表示するコードになります。 このコードの条件に下記のコード } else if ( (制度コード.compareTo("08")==0) || (制度コード.compareTo("09")==0)&& 旧共済退職年金減額該当表示.compareTo("1")==0 ){ out.print ("減額退職"); 年金コードが1の場合 制度コード8なおかつ9または旧共済退職年金減額該当表示が1のとき"減額退職"を表示 とcase 1の中で 旧共済退職年金減額該当表示が1と0で条件判定したいのですが スイッチ文の中のcase 1を複数使用したい場合 どのようにすれば良いのでしょうか? どうぞよろしくお願いします。

    • ベストアンサー
    • Java

専門家に質問してみよう