tkuchikiの日記

新ブログ https://blog.tkuchiki.net

PHP の文字列連結ベンチマーク

sprintf がどのくらい遅いのかと、文字列連結が変数展開よりどれくらい早いかを計測するためベンチマークをとった。
ベンチマークには、Benchmark Timer を使用。
以下が実行時のコードである。

<?php

require_once 'Benchmark/Timer.php';

echo "sprintf \n";
$t = new Benchmark_Timer();

function calc($t, $func) {
    $text = 'foobar';
    $result = 0;
    $loop   = 10;
    for ($i = 0; $i < $loop; $i++) {
        // benchmark start
        $t->start();
        
        $func($text);

        // benchmark end
        $t->stop();
        
        $profile = $t->getProfiling();
        $result  += $profile[1]['total'];
    }

    return $result / $loop;
}

var_dump(calc($t, function($text) {
    for ($i = 0; $i < 1000000; $i++) {
        sprintf("hogehogehogehogehogehogehogehogehoge%s", $text);
    }
}));

echo "変数展開 \n";

var_dump(calc($t, function($text) {
    for ($i = 0; $i < 1000000; $i++) {
        "hogehogehogehogehogehogehogehogehoge$text";
    }
}));

echo "文字列結合 \n";

var_dump(calc($t, function($text) {
    for ($i = 0; $i < 1000000; $i++) {
        "hogehogehogehogehogehogehogehogehoge" . $text;
    }
}));

実行結果

実行結果の単位は秒。

sprintf                                                                                                     
double(1.1232171)
変数展開
double(0.2590721)
文字列結合
double(0.2279141)


sprintf は変数展開と文字列結合より 約4〜5倍くらい実行時間がかかることがわかった。
変数展開と文字列結合の差は微々たるものだが、文字列結合のほうが変数展開より 約 1.13倍 早い。

わざわざ自分でやらなくてもググればどこかに書いていそうだなーと、ベンチマークをとった後に思った。