あずきみるくのあずきはニガテ - for Engineer

ひよっこプログラマがやってみたことやハマっちゃったことなど、備忘録的な感じで書いていきます。

PHP 文字列の連結はどの方法が早い?

PHPです。

文字列の方法が何個かあるんですけど・・・
実際、どれを使うのがはやいんでしょう?

ってことで、調べてたら、こんなサイトを見つけました。

www.sound-uz.jp

で、自分でもやってみよーと思って、コードを拝借して、
やってみました。

方法は

1. 「.=」で連結
2. 「.」で連結
3. 無連結
4. 配列に突っ込んでいって、最終的に文字列にする


<?php
// 連結用文字列
$str1 = "select * from ";
$str2 = "update aaa set aaa = 'aaa'";
$str3 = "select aaa from aaa where aaa = 'aaa'";
$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;

// 配列に突っ込んでから文字列に変換
$time4 = getmicrotime();
for($n = 0; $n < $count; $n++){
  $arr = array();
  $arr[] = $str1;
  $arr[] = $str2;
  $arr[] = $str3;
  $str = implode($arr);
}
$time4 = getmicrotime() - $time4;


// 見栄え良くテーブルに出力
?>
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf8">
<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><tr>
  <td>implode</td>
  <td> <?php echo $time4; ?> </td>
 </tr>
</table>
</body>
</html>

結果はこんな感じ

1回目
f:id:azuki-milk-lush:20150615131058p:plain
2回目
f:id:azuki-milk-lush:20150615131117p:plain
3回目
f:id:azuki-milk-lush:20150615131122p:plain


平均して、順番に並べてみるとこんな感じでした。

No 連結方法 3回の実行時間の平均
3 無連結 0.00143694877625
2 「.」で連結 0.00159462292989
1 「.=」で連結 0.00225273768107
4 配列に突っ込んでいって、最終的に文字列にする 0.00629607836405

まあ、無連結は連結してないからそんなもんで。
意外にも「.」で連結するのが早かったんですね。

javaとかの場合、「+」で文字列を結合するのは
時間がかかりすぎて敬遠してました。
「.」もこの類かと思って敬遠しがちだったのですが、
認識を改める必要がありそうです。

ちなみに。。。

2つめのおまけです。単に幾つかの文字列を連続して出力(表示)するだけならば、
「 echo $str1, $str2, $str3; 」が連結が無いだけに高速です。

というのもありました。
表示用なら連結する必要はないのですね。
ふむふむ。


というわけで、このへんでー。