おっさんエンジニアは若いエンジニアから学ぶ

By Ernst Vikne

「エンジニアは年をとったら若いエンジニアから学ぶんだ」って弾さんが言っていた気がする。

PHP

昨日後輩がPHPが爆速で動くであろう(?)TIPSを教えてくれた!
「なぜ速いか!」
というどうでもいいことを互いの憶測で理解し合ったのでなんだかそれが気持よかった。
どういうことを話したか紹介。

「==」じゃなくて「===」のがはえー!

PHPの比較演算子についてです。

PHPの==は左の項と右の項を比較するわけだけどその時に片方の項(右の項?)の型を変換して左の項と変換を行っているためやや遅い。

イメージ的にはこんな感じだと思う。

<?php
if(TRUE == '1') {
    echo 'hoge';
}
  1. PHP「型ちげーじゃん!」
  2. PHP「左がTRUEでBooleanなんだから'1'もBoolean(TRUE)になれ!」
  3. PHP「ここで比較」

対して===で型判定を入れると、

  1. PHP「型の比較して違ったらすぐ返す」
  2. PHP「型が一緒なら値を比較するだけだからすぐ返す」

完全に感覚的な表現です。
というかPHP自体のソース見れば済む話。
いつか読みます。

ダブルクオーテーションよりシングルクオーテーションのがはえー!

これは知っていたが理屈はなんとなくわかる。
ダブルクオーテーションだと変数展開だと変数が入っているかどうかを判定する必要があるんだけどシングルクオーテーションだと中身を見なくて良い。
これはシンプル。

実際に検証してみた

検証環境

  • PHP5.2.5
  • 多分自分以外ログインしていない社内サーバー
  • APCは無効
  • 10,000,000ループ

以下はソース

<?php

// start time
list($s_usec, $s_sec) = explode(" ", microtime());
$start = (float)$s_sec + (float)$s_usec;

// rand loop
for($i=0; $i<=10000000; $i++) {
    $r = rand();
    // ↓の比較演算子を切り替えて検証
    if($r === 5) {
        // ↓の文字列の囲みを切り替えて検証
        $str = 'hoge';
    }
}

// end time
list($e_usec, $e_sec) = explode(" ", microtime());
$end = (float)$e_sec + (float)$e_usec;

// result
echo $end - $start;

?>

検証結果

結果は型判定比較とシングルクォートのほうがざっくり0.5秒ほど速いようです。
うーん面白かった。

回数 型判定(===)&シングルクォート(') 値判定(==)&ダブルクォート(")
1 10.17530608 10.70869303
2 10.15921688 10.55849695
3 10.15847182 10.58029604
4 10.18673301 10.69251394
5 10.16044402 10.66443801
avg 10.16803436 10.64088759