裏紙に書く程度の内容

PHPの文字列連結 最適な方法を調べる。

PHPの文字列連結についてぐぐってみたら意外な結果だった

http://www.sound-uz.jp/php/note/firstJoin

なんとなくのイメージだけど.による連結より変数を直接書く方が早いんだと思ってたのでそうしてたんだけど、どうやら違うらしい。

($str = "hoge $message";より$str = "hoge ". $message;の方が早いらしい)

検証してみる

下記コードでためしてみる。

<?php

function getmicrotime(){
    list($msec, $sec) = explode(" ", microtime());
    return ((float)$sec + (float)$msec);
}

function test_a() {
    $start_time = getmicrotime();
    for ($idx = 0; $idx < 10000; $idx++) {
        $str = "test num: $idx";
    }
    return getmicrotime() - $start_time;
}

function test_b() {
    $start_time = getmicrotime();
    for ($idx = 0; $idx < 10000; $idx++) {
        $str = "test num: ". $idx;
    }
    return getmicrotime() - $start_time;
}

function test_c() {
    $start_time = getmicrotime();
    for ($idx = 0; $idx < 10000; $idx++) {
        $str = "test num: {$idx}";
    }
    return getmicrotime() - $start_time;
}

function test_d() {
    $start_time = getmicrotime();
    for ($idx = 0; $idx < 10000; $idx++) {
        $str = 'test num: '. $idx;
    }
    return getmicrotime() - $start_time;
}

$results = array(
    'test_a' => 0,
    'test_b' => 0,
    'test_c' => 0,
    'test_d' => 0,
);
for ($i = 0; $i < 1000; $i++) {
    $results['test_a'] += test_a();
    $results['test_b'] += test_b();
    $results['test_c'] += test_c();
    $results['test_d'] += test_d();
}

var_dump($results);

パタン的には
test_a()が非連結(""内に直接変数を入れる形式)、
test_b().による連結、
test_c(){}を使う方式、
ついでにtest_d()test_b()のパタンをダブルくぉーとじゃなくてシングルくぉーとにした場合。

それぞれ1万回文字列連結の処理を繰り返すようにしてそれを1000回試行、かかった秒数の合計を出力。

結果

動かしてみると以下の結果になった。

array(4) {
  ["test_a"]=>
  float(2.4351470470428)
  ["test_b"]=>
  float(2.2811152935028)
  ["test_c"]=>
  float(2.510134935379)
  ["test_d"]=>
  float(2.2621443271637)
}

参考記事にある通りなんだけど、test_b.を使った連結が一番早い。

ちなみにtest_b,test_d結果は上記ではtest_d(シングルクォート版)がわずかに早かったが何度か実行してみるとtest_bのダブルクォート版の方が早い場合もあり、誤差レベルのようでした。

test_bの実行を約 2.28s とすると、10,000 * 1,000 回の実行なので1回あたりは 0.00000228s( 0.00228ms )。

一番遅かったtest_aとの差分を見ると1回あたりに換算すると 約 0.000229ms

マシンスペックによるでしょうけどこれはもうパフォーマンス的に気にするほどのレベルじゃない。

少なくともパフォーマンスを気にしてなおしたところで実感は出来ないでしょう。(よほど大量に文字列連結をするプログラムなら別だけど)

じゃあどれがいいのか?

パフォーマンス気にしなくていいなら可読性。なんだけど・・・

$str_a = "hoge ". $var1. " message ". $var2;
$str_b = "hoge $var1 message $var2";
$str_c = "hoge {$var1} message {$var2}";
$str_d = 'hoge '. $var1. ' message '. $var2;

これはもう好みですよね。
個人的には b or c が見やすいんだけど同僚に聞いたら「いや、aとdの方が見やすいだろ」とのことです。

しいて言うならば a のようにダブルクォートを使う理由はないのでこれは却下。

それ以外ならぶっちゃけなんでもいいけど個人的には b or c パターン推し。

参考

http://www.sound-uz.jp/php/note/firstJoin

Index