PHPでtrue/falseを判定する同じ処理のif文がありますが、実行速度はどちらが速いのでしょうか?
if ($hoge === true) {}
if ($hoge) {}
また、その理由などがありましたら教えて頂けると助かります。宜しくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答6件
0
ベストアンサー
昔、C言語を書いていて、C をアセンブラ化して処理内容を見た経験からの内容です。
違っていたら申し訳ないです。
if 文の処理内容を正確に言うと
if 条件式 { 文 }
条件式の結果が真 (true) か偽 (false) かの判定を行い、真であれば文を実行することになります。
真 (true) = "0 以外" であれば文を実行、偽であれば文は実行しません。
前者は $hoge という変数の値が true と同じかどうかの判定を行い、結果が同じであれば真、異なれば偽となります。
実際 0 以外という数値がどのように求められるかは、言語によって異なるかもしれませんが、$hoge - true の結果が 0 ( 同じ数値である) ならば 1、0 以外になれば 0 とします。
後者は $hoge という変数値自体が真 (0 以外) であれば文を実行することになります。
前者は1回計算を実行して真・偽を判定するのに対し、後者は変数の値のみの判定になるので、後者のほうが早いということになります。
投稿2016/03/22 03:52
総合スコア257
0
実証コードを書いてみました。
PHP
1<?php 2$flag = true; 3$max = 200000000; 4 5$t = microtime(true); 6for ($i = 0; $i < $max; $i++) { 7 if ($flag === true) { 8 // nothing 9 } 10} 11echo (microtime(true)-$t)."\n"; 12 13$t = microtime(true); 14for ($i = 0; $i < $max; $i++) { 15 if ($flag) { 16 // nothing 17 } 18} 19echo (microtime(true)-$t)."\n";
結果です。
PHP 5.6.18 一回目 8.446121931076 7.4364190101624 二回目 8.2857820987701 7.2701110839844 三回目 8.1969020366669 7.4167370796204 PHP 7.0.3 一回目 4.4259450435638 3.9217050075531 二回目 5.1839411258698 4.568244934082 三回目 4.4475159645081 3.926470041275 ```後者の方が速いですね。 順序をひっくり返しても、同じような結果になりました。 しかし、裏で何かが動いただけで違うと思います。 しかし、PHP 7は速いですね。
投稿2016/03/22 02:58
総合スコア4437
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
opcode を見た感じ、
https://3v4l.org/HnRDF/vld#tabs
前者だと下記の2つなのに対して
- IS_IDENTICAL
- JMPZ
後者なら下記の1つなので
- JMPZ
後者の方が早そうです。
投稿2016/03/22 06:36
総合スコア4514
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2016/03/22 09:23
0
早い順から次の結果になりました。
if ($hoge)
≒if ((boolean)$hoge) {}
if ($hoge === TRUE) {}
if ($hoge == TRUE) {}
理由としては、制御構造(if)に渡る前に比較演算子の処理が入るためと思われます。
また、「==」より「===」のほうが早いのは「==」は型の変換処理を内部で実行するためらしいです。
※公式のリファレンスには記述が見つからなかったので、正しい情報かはわかりません。
ただ個人のブログや非公式のコミュニティでは上記の説明をされるケースが多かったです。
投稿2016/03/22 04:00
総合スコア421
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2016/03/22 09:30
0
ご質問に対する回答ではありませんが、、
PHPでtrue/falseを判定する同じ処理のif文がありますが、
同じ処理ではありません。
if ($hoge === true)
は両辺の型も一致したときに始めてtrue
となるのに対して、
if ($hoge)
は変数$hoge
をbool型に暗黙の型変換を行なった上で、真偽を判定するからです。
(つまり、if ($hoge == true)
と同じ動きになります)
どちらが速いかについては、shi_ue様のようにご自身の環境で実際にテストしてみるのが良いと思います。
個人的には、youji様のご回答と同じ理由で後者の方が速くなるかな?と思います。
投稿2016/03/22 04:12
総合スコア4791
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2016/03/22 09:25
0
実行速度は環境に依存するため、下記のコードで実際に測ってみてはどうでしょうか?
php
1<?php 2$hoge = true; 3$max_count = 1000000; 4$start = microtime(); 5for ($count = 0; $count < $max_count; $count++){ 6 if ($hoge === true) {}; 7} 8$end = microtime(); 9echo $end - $start."\n"; 10 11$start = microtime(); 12for ($count = 0; $count < $max_count; $count++){ 13 if ($hoge) {}; 14} 15$end = microtime(); 16echo $end - $start."\n";
投稿2016/03/22 03:14
総合スコア551
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2016/03/22 09:37