U mnie na kompie Twój przykład pokazuje:
usort: 0.16182208061218
quicksort: 0.29244804382324
Linux Mint, PHP 5.3.6-13ubuntu3.8 with Suhosin-Patch (cli) (built: Jun 13 2012 18:02:19)
Kiedy w usort wyciągnę funkcję przed pętlę to osiągam wynik:
usort: 0.14249086380005
Kod:
<?php
function microtime_float()
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
function set(&$uzytkownik)
{
$uzytkownik[0][0] = "Jasiu";
$uzytkownik[0][1] = 22;
$uzytkownik[1][0] = "Wacek";
$uzytkownik[1][1] = 21;
$uzytkownik[2][0] = "Misiek";
$uzytkownik[2][1] = 16;
$uzytkownik[3][0] = "Kasia";
$uzytkownik[3][1] = 11;
}
$sort_function = function($a, $b){return ($a[1] == $b[1]) ? 0 : ($a[1] < $b[1]) ? -1 : 1;};
$time = microtime_float();
for ($i = 0; $i<50000; $i++) {
set($uzytkownik);
usort($uzytkownik, $sort_function);
}
$time = microtime_float()-$time;
echo "usort: ".$time;
?>
Coś słabego kompa masz, albo Ci się przecinek przesunął :D
Edit:
PHP 5.4.4-4~oneiric+1 (cli) (built: Aug 6 2012 13:02:38)
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2012 Zend Technologies
Mój usort:
0.11031198501587
Twój kod:
usort: 0.1178719997406
quicksort: 0.2293701171875
Edit (Większy zbiór):
usort: 0.99025988578796
quicksort: 0.90684819221497
Dorzucę jeszcze przy okazji funkcję sorted Pythona:
from datetime import datetime
def set():
uzytkownik=[]
uzytkownik.append(("Jasiu",22,))
uzytkownik.append(("Wacek",21,))
uzytkownik.append(("Misiek",16,))
uzytkownik.append(("Kasia",11,))
return uzytkownik
d1=datetime.now()
for i in xrange(0,50000):
uzytkownik=set()
osoby=sorted(uzytkownik, key=lambda a: a[1])
d=datetime.now()-d1
print d
Dla małego zbioru:
Python 2.7
0:00:00.099229
Python 3.2
0:00:00.096701
PyPy
pypy --version
Python 2.7.2 (1.9+dfsg-1ubuntu11.10.1ppa1, Jun 21 2012, 11:32:29)
[PyPy 1.9.0 with GCC 4.6.1])
0:00:00.063299
Dla dużego zbioru:
Python 2.7:
0:00:00.271632
Python 3.2:
0:00:00.247024
PyPy:
0:00:00.226309
Prostsze, szybsze i przyjemniejsze, a ludzie dalej przy PHP siedzą :D