PHP 文字列のシングルバイト操作 - substr は非常に遅い
文字列内の1バイトを操作したい場合、どのような方法を使用すればよいでしょうか?私はいつも、substr 関数はそれほど遅くないだろうと思っていました。しかし今日テストしてみたところ、違うことが分かりました。以下はテストコードです:
?
<?php $str='abcdefghijklmnopqrstuvwxyz1234567890'; error_reporting(E_ALL); /** * Simple function to replicate PHP 5 behaviour */ function microtime_float() { list($usec, $sec) = explode(" ", microtime()); return ((float)$usec + (float)$sec); } //使用substr函数 $start=microtime_float(); for ($k = 100; $k > 0; $k--) { for ($i=0;$i<strlen($str);$i++) echo substr($str,$i,1), ' '; } $end = microtime_float(); echo("<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/> t i m e :" . round( $end - $start ,6) ."<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>"); //使用字节操作 $start=microtime_float(); for ($k = 100; $k > 0; $k--) { for ($i=0;$i<strlen($str);$i++) echo $str{$i}, ' '; } $end = microtime_float(); echo("<br/> <br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>t i m e :" . round( $end - $start ,6) ."<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>"); //使用数组模式操作 $start=microtime_float(); for ($k = 100; $k > 0; $k--) { for ($i=0;$i<strlen($str);$i++) echo $str[$i], ' '; } $end = microtime_float(); echo("<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/> t i m e :" . round( $end - $start ,6) ."<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>"); ?>
?テスト結果は次のとおりです:
時間:0.003782
時間:0.002862
時間:0.002587
時間:0.00351
時間:0.002649
時間:0.002786
substr の速度が非常に遅いことがわかります。バイト演算モードと配列演算モードは同じレベルです。このことから、文字列に対してバイト操作を実行する場合は、バイト操作モードを使用するのが最善であると考えられます。この方法を使用すると、変数の型が配列であるという誤った認識につながることがないからです。
もちろん、この操作方法には制限があります。つまり、中国語の文字列はこの方法では処理できず、mb_substr のみを使用できます!!