Henryk Plötz: Frage zu Singelton

Beitrag lesen

Moin,

Ähm serialize()/unserialize() sind da doch ziemlich aufwendig, da man diese Daten bei jedem aufruf irgendeiner Seite braucht spaart man sich da schon mal einiges dadurch dass es gleich als Array abgespeichert ist.

Eigentlich ist es umgekehrt: serialize/unserialize machen die Signalisierung out-of-band und sind deshalb weniger aufwendig. In PHP-Syntax geht ein String vom ' bis zum nächsten ', ausser wenn da ein \ vor steht, es sei denn davor ist ein \ usw. Da muss richtig geparsed werden, und das ist komplex. In der serialize-Syntax steht am Anfang sowohl der Typ (den PHP sonst nur implizit erkennen kann) als auch die Länge, unserialize muss also nur noch x Bytes lesen, ohne sie sich anzuschauen.

Ich habe aber natürlich nicht gemessen.

Ich habe das grade mal getan und es bestätigt meine Intuition (auch wenn der Unterschied schwächer ausfällt, als vermutet):
save.php:

  
<?php  
$a = Array();  
  
for($i=0; $i < 1000; $i++) {  
  $b = "";  
  for($j=0; $j < 100; $j++) {  
    $b .= chr(rand(0,255));  
  }  
  $a[] = $b;  
}  
  
$c = var_export($a, true);  
$d = serialize($a);  
  
$fh = fopen("var_exported", "wb");  
fwrite($fh, "<?php \$a=" . $c . ";");  
fclose($fh);  
  
$fh = fopen("serialized", "wb");  
fwrite($fh, $d);  
fclose($fh);  
?>

load-serialize.php:

  
<?php  
$a = unserialize(file_get_contents("serialized"));  
echo count($a);  
?>

load-var_export.php:

  
<?php  
include("var_exported");  
echo count($a);  
?>

Zeit für 1000 mal load-serialize: 13m48.256s
Zeit für 1000 mal load-var_export: 14m23.399s
(Geschätzte Genauigkeit liegt in der Gegend von 10 Sekunden)

Hmm, das sind nur ca. 4%, ich hätte mehr erwartet. Vermutlich geht der Löwenanteil der Arbeit für das Laden des PHP-Interpreters drauf, und wenn man den Stunt mehrfach in einem Skript (mit verschiedenen Datensätzen versteht sich) durchzieht wird der Unterschied größer.

--
Henryk Plötz
Grüße aus Berlin
~~~~~~~~ Un-CDs, nein danke! http://www.heise.de/ct/cd-register/ ~~~~~~~~
~~ Help Microsoft fight software piracy: Give Linux to a friend today! ~~