fork download
  1. <?php
  2. define('NUMBER_OF_TESTS', 5000);
  3. define('ARRAY_SIZE', 200);
  4.  
  5. function quicksort( $array )
  6. {
  7. $cur = 1;
  8. $stack[1]['l'] = 0;
  9. $stack[1]['r'] = count($array)-1;
  10.  
  11. do
  12. {
  13. $l = $stack[$cur]['l'];
  14. $r = $stack[$cur]['r'];
  15. $cur--;
  16.  
  17. do
  18. {
  19. $i = $l;
  20. $j = $r;
  21. $tmp = $array[(int)( ($l+$r)/2 )][1];
  22.  
  23. do
  24. {
  25. while ( $array[$i][1] < $tmp )
  26. $i++;
  27.  
  28. while ( $tmp < $array[$j][1] )
  29. $j--;
  30.  
  31. if ( $i <= $j )
  32. {
  33. $w = $array[$i];
  34. $array[$i] = $array[$j];
  35. $array[$j] = $w;
  36.  
  37. $i++;
  38. $j--;
  39. }
  40.  
  41. } while ( $i <= $j );
  42.  
  43.  
  44. if ( $i < $r )
  45. {
  46. $cur++;
  47. $stack[$cur]['l'] = $i;
  48. $stack[$cur]['r'] = $r;
  49. }
  50. $r = $j;
  51.  
  52. } while( $l < $r );
  53.  
  54. } while( $cur != 0 );
  55.  
  56. return $array;
  57. }
  58.  
  59. function microtime_float()
  60. {
  61. return microtime(true);
  62. }
  63.  
  64. function set(&$array)
  65. {
  66. for ($i = 0; $i<ARRAY_SIZE; $i++)
  67. {
  68. $array[$i][0] = "user ".$i;
  69. $array[$i][1] = rand(10, 100);
  70. }
  71. }
  72.  
  73. echo "<pre>";
  74.  
  75. // ----------
  76.  
  77. $time = microtime_float();
  78. set($array);
  79. $time = microtime_float()-$time;
  80. $settime = ($time*NUMBER_OF_TESTS)/2;
  81.  
  82. // ----------
  83.  
  84. function usort_function($a, $b)
  85. {
  86. return ($a[1] == $b[1]) ? 0 : ($a[1] < $b[1]) ? -1 : 1;
  87. }
  88.  
  89. $time = microtime_float();
  90. for ($i = 1; $i<NUMBER_OF_TESTS; $i++)
  91. {
  92. if ($i&1)
  93. set($array);
  94. usort($array, 'usort_function');
  95. }
  96. $time = microtime_float()-$time;
  97. echo "usort: ".$time."-".$settime."=<br>".($time-$settime)."<br>";
  98.  
  99. echo "<br>";
  100.  
  101. // ----------
  102.  
  103. $time = microtime_float();
  104. for ($i = 1; $i<NUMBER_OF_TESTS; $i++)
  105. {
  106. if ($i&1)
  107. set($array);
  108. $array = quicksort($array);
  109. }
  110. $time = microtime_float()-$time;
  111. echo "quicksort: ".$time."-".$settime."=<br>".($time-$settime)."<br>";
  112.  
  113. echo "</pre>";
  114. ?>
Success #stdin #stdout 11.51s 13064KB
stdin
Standard input is empty
stdout
<pre>usort: 7.0912258625-1.24990940094=<br>5.84131646156<br><br>quicksort: 4.40364909172-1.24990940094=<br>3.15373969078<br></pre>