PHP Note 》
文字列連結どれが速い?
created: 2003-01-22 | modified: 2006-04-17
お詫び:コードが間違ってたためにながらく間違ったことをお伝えしていました。どうもすみません。
あらためて、文字列連結の手段のうち、「.=」による追記、「.」による連結、変数を「""」に埋め込む非連結、3つの実行速度を確認してみました。書き方がそれぞれ違うので、代入1回、連結2回、をおこなってバランスを取ることにします。
この差を確かめるべく、関数内で値を変更するようテストコードを直しましたので「新テストコード」をおためしください。
テストコード(修正版)
<?php
// 連結用文字列
$str1 = "AAA";
$str2 = "BBB";
$str3 = "CCC";
$count = 10000; / /繰り返す回数
// 現在の時間をマイクロ秒単位で返す関数
function getmicrotime(){
list($msec, $sec) = explode(" ", microtime());
return ((float)$sec + (float)$msec);
}
// 追記編
$time1 = getmicrotime();
for($n = 0; $n < $count; $n++){
$str = $str1;
$str .= $str2;
$str .= $str3;
}
$time1 = getmicrotime() - $time1;
// 連結編
$time2 = getmicrotime();
for($n = 0; $n < $count; $n++){
$str = $str1.$str2.$str3;
}
$time2 = getmicrotime() - $time2;
// 非連結編
$time3 = getmicrotime();
for($n = 0; $n < $count; $n++){
$str = "$str1$str2$str3";
}
$time3 = getmicrotime() - $time3;
// 見栄え良くテーブルに出力
?>
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=Shift_JIS">
<title>文字列連結実行速度比較</title>
</head>
<body>
<table border="2">
<caption>文字列連結<br> <?php echo $count; ?> 回の実行速度比較</caption>
<tr>
<td>追記</td>
<td> <?php echo $time1; ?> </td>
</tr><tr>
<td>連結</td>
<td> <?php echo $time2; ?> </td>
</tr><tr>
<td>非連結</td>
<td> <?php echo $time3; ?> </td>
</tr>
</table>
</body>
</html>
結果
- テストコードを実行 (クリックで別ウィンドが開きます)
「.(ピリオド)」を使った連結がもっとも高速でした。この次が非連結、次が追記という順番でした。文字列連結は頻繁におこなうものだけに、全てを「.」の連結に直せば、実感できるくらいパフォーマンスが改善されることも十分考えられます。
おまけです。文字列中に変数を埋め込むのに 「 {}(大括弧)」を使う方法がありますが、「$str = "AAAA{$str}BBB";」という書き方は「$str = "AAAA".$str."BBB";」に比べて倍ほど時間を要します。単なる文字列連結には向きません。
2つめのおまけです。単に幾つかの文字列を連続して出力(表示)するだけならば、
「 echo $str1, $str2, $str3; 」が連結が無いだけに高速です。
PHP Note 》


