Jeste da koristim MySQL za sve i svašta, ali kod ovog zadatka ja sam ipak za memoriju. Za kontrolni array bih koristio hash array, mnogo je brži nego obični. Ali, (naravno postoji ali) hash array koristi mnogo memorije ... Jeste, za 2 miliona objekata za ovaj zadatak troši se nešto manje od 300Mb. Ali zato je vreme izvršavanja na kućnoj mašini 45 sekundi sa sve debugom!
Evo koda:
PHP kôd:
?
set_time_limit(0);
ini_set ('memory_limit', 300000000);
$out = array();
$t = time();
$i = 0;
while (sizeof($out)<2000000) {
if (!(++$i%100000)) {
print "$i ".sizeof($out)."<BR>";
flush();
}
$s = substr(md5(microtime().rand(1,1000)),5,8);
if (!$check[$s]) {
$check[$s]++;
$out[] = $s;
}
}
$t = time() - $t;
print "izvrseno za $t s, provereno $i kodova<BR>";
for ($i = 0; $i<100; $i++) {
print "$out[$i]<BR>";
}
?>
Programče ispiše nešto tipa:
izvrseno za 45 s, provereno 2000490 kodova
Mogla bi se uštedeti koja sekunda bez ispisivanja kontrolnih podataka, i uklanjanja rand(..) funkcije. rand funkcija je tamo za one koji ne veruju da je substring od petog mesta za microtime dovoljno slučajan.
Čak i kod ovako jednostavnih zadataka ne prolazimo jeftino. Nešto uvek trpi, da li memorija, da li procesor, ili vreme. Ovde je to bila memorija, ali uslovno rečeno, jer se danas 300Mb baš i ne smatra zauzećem memorije, naročito ako ono traje manje od minut. Koliko bi ovo trajalo sa MySQL?
Myth Busted.