OK.  Here are the results of my rough benchmark.  Every time I ran it, the 
results were within about .025 seconds of each other so it seems accurate.  
Surprisingly, my original mb_substr method won, with preg_split taking just a 
little bit longer.  John's method of grabbing the first character and then 
removing it from the string actually seems take almost exponentially more time 
based on how long the string is.  I set $strSize to 1000 and had to kill it 
because I didn't want to wait so long.  There must be something pretty 
inefficient going on in mb_substr to make that the case.  I suppose we could 
look at the source to get to the bottom of it... but I think I've already spent 
as much time on this as I'm willing to.  Thanks again to you guys.

$ php mbtest.php
normal iteration took 0.8041729927063
mb_substr method took 1.7228858470917
mb_substr method with shortening the string took 7.9840841293335
preg_split method took 2.1547298431396

$ cat mbtest.php 
<?php

$strSize = 100;
$repeats = 1000;

// make the string somewhat large
$str = '';
for ($i = 0; $i < $strSize; $i++) {
        $str .= "string with utf-8 chars\n   åèö";
}

// non-multibyte iteration
$start = microtime(true);
for ($i = 0; $i < $repeats; $i++) {
        $length = strlen($str);
        $newStr = '';
        for ($j = 0; $j < $length; $j++) {
                $newStr .= $str{$j};
        }
}
$end = microtime(true);
echo "normal iteration took " . ($end - $start) . "\n";

// mb_substr method
$start = microtime(true);
for ($i = 0; $i < $repeats; $i++) {
        $length = mb_strlen($str);
        $newStr = '';
        $rest = $str;
        for ($j = 0; $j < $length; $j++) {
                $newStr .= mb_substr($rest, $j, 1);
        }
}
$end = microtime(true);
echo "mb_substr method took " . ($end - $start) . "\n";

// mb_substr method, shortening string
$start = microtime(true);
for ($i = 0; $i < $repeats; $i++) {
        $length = mb_strlen($str);
        $newStr = '';
        $rest = $str;
        while ($rest) {
                $newStr .= mb_substr($rest, 0, 1);
                $rest = mb_substr($rest, 1);
        }
}
$end = microtime(true);
echo "mb_substr method with shortening the string took " . ($end - $start) . 
"\n";

// preg_split method
$start = microtime(true);
for ($i = 0; $i < $repeats; $i++) {
        $chars = preg_split('//u', $str, -1, PREG_SPLIT_NO_EMPTY);
        $length = count($chars);
        $newStr = '';
        for ($j = 0; $j < $length; $j++) {
                $newStr += $chars[$j];
        }
}
$end = microtime(true);
echo "preg_split method took " . ($end - $start) . "\n";



_______________________________________________
New York PHP Users Group Community Talk Mailing List
http://lists.nyphp.org/mailman/listinfo/talk

http://www.nyphp.org/Show-Participation

Reply via email to