HERANGR

... aneb "odizolujte ty trubky"

Nebojte se serialize()

PHP slonKonečně jsem se odhodlal a zkouším napsat nějaký odborný článek. Moc jsem po tom nepátral (i když jsem asi měl), ale zdá se mi že php funkce serialize() a unserialize() nejsou moc oblíbené. Je to možná kvůli jejich náročnosti. Tak jsem si udělal vlastní výzkum.

Protože při vývoji aktuální verze hry, bylo třeba uložit do databáze mapu. Uvažoval jsem co na to využit. Mapa se skládá z několika vrstev z čehož nejobsáhlejší vrstvou jsou textury. Mapa má rozměry 60*60 takže je celkem 3600 políček s texturami a každé poličko obsahuje jinou hodnotu.

Postavil jsem si proto jakýsi benchmark který měří časovou náročnost a velikost výstupu funkcí serialize() a unserialize() a funkcí implode() a explode() (pro porovnání) a výsledky mě velice mile překvapily.

<?php for($i=0;$i<1000;$i++){ $pole[$i]="12345"; } $zacatek=mikrocas(); $ser=serialize($pole); echo "<tr><td>Čas zpracování: ".(round((mikrocas()-$zacatek)/100,5))." s</td></tr>"; echo "<tr><td>Výsledná velikost: ".tri(strlen($ser))."</td></tr>"; unset($ser, $pole); ?>

Ukázka zdrojového kódu souboru se1000.php

Celý benchmark s výsledky měření si můžete prohlédnout na adrese ukazky.herangr­.cz/serialize/.

Pro mně asi největším překvapení bylo že více rozměrové pole má menší výstup než pole jedno rozměrové. Také si můžete všimnout že funkce implode() a explode() jsou rychlejší a jejich výstup je menší, ovšem pro mé účely se příliš nehodily, protože nedokáži uložit index pole. Naopak při ukládání stotisícového pole přes serialize() je téměř 20× větší než vstup (při délce obsahu každého prvku pole 5 znaků).

Zdroj obrázků http://www.squidoo.com/