PHP Note
category: 実験・実測 ファイル形式別読み込み速度比較 関数の値渡しと参照渡しどちらが速い?

文字列連結どれが速い?

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; 」が連結が無いだけに高速です。



category: 実験・実測 ファイル形式別読み込み速度比較 関数の値渡しと参照渡しどちらが速い?
PHP Note
ページの一番上へ
Googleグックマークに登録 Yahooグックマークに登録 livedoorクリップに登録 @niftyクリップに登録 はてなブックマークに登録 deliciousに登録 Buzzurlに登録 FC2ブックマークに登録
最近更新したNote
よく読まれている記事
Yahoo Search

最近更新された掲示板トピックス
PHPマニュアル
今日のブックマーク
PHPマニュアル関数検索
関数名を入力し検索ボタンをクリック↑