Pogledajte određenu poruku
Staro 02. 02. 2006.   #24
marinowski
Igor Marinović
Expert
 
Avatar marinowski
 
Datum učlanjenja: 09.06.2005
Lokacija: Palić
Poruke: 549
Hvala: 31
39 "Hvala" u 17 poruka
marinowski is on a distinguished road
Pošaljite ICQ poruku za marinowski
Default

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.

Poslednja izmena od nixa : 02. 02. 2006. u 13:39.
marinowski je offline   Odgovorite uz citat