質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

6回答

4189閲覧

PHPでのif文の速度について

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

2グッド

4クリップ

投稿2016/03/22 02:33

PHPでtrue/falseを判定する同じ処理のif文がありますが、実行速度はどちらが速いのでしょうか?

if ($hoge === true) {}

if ($hoge) {}

また、その理由などがありましたら教えて頂けると助かります。宜しくお願いします。

act823, ucan-lab👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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

youji

総合スコア257

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/03/22 09:37

詳しい説明ありがとうございました。納得がいきました、なるほど! 回答どうもありがとうございました。
guest

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

shi_ue

総合スコア4437

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/03/22 09:56

わざわざ検証して頂いてありがとうございました。2倍速くなるPHP7は偉大ですね! 回答どうもありがとうございました。
guest

0

opcode を見た感じ、

https://3v4l.org/HnRDF/vld#tabs

前者だと下記の2つなのに対して

  • IS_IDENTICAL
  • JMPZ

後者なら下記の1つなので

  • JMPZ

後者の方が早そうです。

投稿2016/03/22 06:36

ngyuki

総合スコア4514

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/03/22 09:23

なるほど、参考になります。 このサービス使ってみると一目瞭然ですね。自分も試してみたいと思います。 ありがとうございました。
guest

0

早い順から次の結果になりました。

  1. if ($hoge)if ((boolean)$hoge) {}
  2. if ($hoge === TRUE) {}
  3. if ($hoge == TRUE) {}

理由としては、制御構造(if)に渡る前に比較演算子の処理が入るためと思われます。
また、「==」より「===」のほうが早いのは「==」は型の変換処理を内部で実行するためらしいです。
※公式のリファレンスには記述が見つからなかったので、正しい情報かはわかりません。
ただ個人のブログや非公式のコミュニティでは上記の説明をされるケースが多かったです。

投稿2016/03/22 04:00

rkojima

総合スコア421

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/03/22 09:30

if ($hoge) ≒ if ((boolean)$hoge) というのが新鮮でした。勉強になります。 回答どうもありがとうございました。
guest

0

ご質問に対する回答ではありませんが、、

PHPでtrue/falseを判定する同じ処理のif文がありますが、

同じ処理ではありません。

if ($hoge === true)は両辺の型も一致したときに始めてtrueとなるのに対して、
if ($hoge)は変数$hogeをbool型に暗黙の型変換を行なった上で、真偽を判定するからです。
(つまり、if ($hoge == true)と同じ動きになります)

比較演算子
if式
booleanへの変換

どちらが速いかについては、shi_ue様のようにご自身の環境で実際にテストしてみるのが良いと思います。

個人的には、youji様のご回答と同じ理由で後者の方が速くなるかな?と思います。

投稿2016/03/22 04:12

KiyoshiMotoki

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/03/22 09:25

そのような処理だったんですね。リンク先も勉強になりました。 回答どうもありがとうございます。
guest

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

KaiShoya

総合スコア551

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shi_ue

2016/03/22 03:18

あら?似てる(笑) っていうか、同じようなコードに行きつきますよね。でもmicrotimeはtrueを引数に取らないと、「microsecond second」っていう文字列で返します。
退会済みユーザー

退会済みユーザー

2016/03/22 09:52

書いて頂いたコードを実際に自分の環境(VMware)で試してみましたが、後者のほうが5-6%ほど速かったです。結構違うものなのですね。回答どうもありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問