scwizard Posted July 3, 2012 Share Posted July 3, 2012 // Former method. $temp = preg_split("/(\r?\n)/", $bigstring); $temp_size = count($temp); $n = 0; while($n < $temp_size) { $result[$temp[$n]] = $temp[$n + 1]; $n = $n + 2; } // Later method. $temp = preg_split("/(\r?\n)/", $bigstring); foreach(array_chunk($temp, 2) as $part){ $result[$part[0]] = $part[1]; } To me it seems like the former is faster and saner, because it's similar to how I'd do it in C. The later seems slower, because you convert array A into array B before it becomes array C. However someone from ##php thought the former was slower and less sane, because "you're trying to optimize something php has already optimized for you, and you're doing it poorly." Quote Link to comment https://forums.phpfreaks.com/topic/265161-which-method-is-faster-and-saner-simple-example/ Share on other sites More sharing options...
haku Posted July 3, 2012 Share Posted July 3, 2012 Run a benchmark on it. Put each example in a loop that goes many times (1000+), and calculate the amount of time it takes. Let us know the answer. Quote Link to comment https://forums.phpfreaks.com/topic/265161-which-method-is-faster-and-saner-simple-example/#findComment-1358823 Share on other sites More sharing options...
xyph Posted July 3, 2012 Share Posted July 3, 2012 I would GUESS the first one would be faster. A raw foreach will generally be faster than a for/while for iterating through an array, but the array_chunk will add extra memory requirements, and could be slow on it's own. For huge arrays, I'd go with the former for sure. For smaller arrays, I doubt there'd be enough difference to really matter... Quote Link to comment https://forums.phpfreaks.com/topic/265161-which-method-is-faster-and-saner-simple-example/#findComment-1358829 Share on other sites More sharing options...
kicken Posted July 3, 2012 Share Posted July 3, 2012 My quick benchmarks seem to indicate the first one is faster, but only just barely. I'm not sure how big your bigstring is, I tested using the contents of a 22MB file which is definitely a big string. With such a big string a single run took a few seconds so I only ran it a few times rather than a few thousand. Results: Begin testing, num tests = 9 //Method 1 Total time: 27.806; tracked 1 points Time track: Point: Method 1 end From start: 27.806 From prev: 27.806 //Method 1(alt) Total time: 3.093; tracked 1 points Time track: Point: Method 1 (alt) end From start: 3.093 From prev: 3.093 //Method 2 Total time: 28.880; tracked 1 points Time track: Point: Method 2 ends From start: 28.880 From prev: 28.880 //Method 2(alt) Total time: 4.881; tracked 1 points Time track: Point: Method 2 (alt) ends From start: 4.881 From prev: 4.881 //Method 3 Total time: 3.474; tracked 1 points Time track: Point: Method 3 ends From start: 3.474 From prev: 3.474 Method 1(alt) and Method 2(alt) are the same as method 1 and 2, but using str_replace+explode rather than preg_split. Method 3 is str_replace+explode and a for loop rather than the while loop. <?php require 'timer.php'; $bigstring = file_get_contents('bigstring'); $runCount=0; $numTests=mt_rand(1,9); echo "Begin testing, num tests = {$numTests}\r\n"; marktime(false, 'Method 1 begin'); for ($runCount=0; $runCount<$numTests; $runCount++){ unset($result); $temp = preg_split("/(\r?\n)/", $bigstring); $temp_size = count($temp); $n = 0; while($n < $temp_size) { $result[$temp[$n]] = $temp[$n + 1]; $n = $n + 2; } } marktime(true, 'Method 1 end'); echo "\r\n"; marktime(false, 'Method 1 (alt) begin'); for ($runCount=0; $runCount<$numTests; $runCount++){ unset($result); $temp = explode("\n", str_replace(array("\r\n","\r"), "\n", $bigstring)); $temp_size = count($temp); $n = 0; while($n < $temp_size) { $result[$temp[$n]] = $temp[$n + 1]; $n = $n + 2; } } marktime(true, 'Method 1 (alt) end'); echo "\r\n"; markTime(false, 'Method 2 begin'); for ($runCount=0; $runCount<$numTests; $runCount++){ // Later method. unset($result); $temp = preg_split("/(\r?\n)/", $bigstring); foreach(array_chunk($temp, 2) as $part){ $result[$part[0]] = $part[1]; } } markTime(true, 'Method 2 ends'); echo "\r\n"; markTime(false, 'Method 2 (alt) begin'); for ($runCount=0; $runCount<$numTests; $runCount++){ // Later method. unset($result); $temp = explode("\n", str_replace(array("\r\n", "\r"), "\n", $bigstring)); foreach(array_chunk($temp, 2) as $part){ $result[$part[0]] = $part[1]; } } markTime(true, 'Method 2 (alt) ends'); echo "\r\n"; marktime(false, 'Method 3 begin'); for ($runCount=0; $runCount<$numTests; $runCount++){ unset($result); $temp = explode("\n", str_replace(array("\r\n","\r"), "\n", $bigstring)); for ($i=0,$len=count($temp); $i<$len; $i+=2){ $result[$temp[$i]] = $temp[$i+1]; } } markTime(true, 'Method 3 ends'); echo "\r\n"; ?> Quote Link to comment https://forums.phpfreaks.com/topic/265161-which-method-is-faster-and-saner-simple-example/#findComment-1358845 Share on other sites More sharing options...
haku Posted July 3, 2012 Share Posted July 3, 2012 Good stuff! Quote Link to comment https://forums.phpfreaks.com/topic/265161-which-method-is-faster-and-saner-simple-example/#findComment-1358848 Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.