Wirklich schönes Thema und nachdem ich die wenigen Antworten gelesen habe, möchte ich meine Experimente zu diesem Thema teilen.
Ich habe einen Anwendungsfall, in dem fast jedes Mal, wenn ich mit der Datenbank spreche, eine "riesige" Tabelle abgefragt werden muss (fragen Sie nicht warum, nur eine Tatsache). Das Datenbank-Caching-System ist nicht geeignet, da es die verschiedenen Anforderungen nicht zwischenspeichert. Daher habe ich über PHP-Caching-Systeme nachgedacht.
Ich habe es versucht, apcu
aber es passte nicht zu den Anforderungen. Der Speicher ist in diesem Fall nicht zuverlässig genug. Der nächste Schritt bestand darin, eine Datei mit Serialisierung zwischenzuspeichern.
Die Tabelle enthält 14355 Einträge mit 18 Spalten. Dies sind meine Tests und Statistiken zum Lesen des serialisierten Caches:
JSON:
Wie Sie alle sagten, besteht die größte Unannehmlichkeit bei json_encode
/ json_decode
darin, dass alles in eine StdClass
Instanz (oder ein Objekt) umgewandelt wird. Wenn Sie es schleifen müssen, werden Sie es wahrscheinlich in ein Array umwandeln, und ja, es erhöht die Umwandlungszeit
durchschnittliche Zeit: 780,2 ms; Speichernutzung: 41,5 MB; Cache-Dateigröße: 3,8 MB
Msgpack
@ Hutch erwähnt msgpack . Hübsche Website. Probieren wir es aus.
durchschnittliche Zeit: 497 ms; Speichernutzung: 32 MB; Cache-Dateigröße: 2,8 MB
Das ist besser, erfordert aber eine neue Erweiterung. manchmal ängstliche Menschen zusammenstellen ...
IgBinary
@ GingerDog erwähnt igbinary . Beachten Sie, dass ich das festgelegt habe, igbinary.compact_strings=Off
weil mir die Leseleistung wichtiger ist als die Dateigröße.
durchschnittliche Zeit: 411,4 ms; Speichernutzung: 36,75 MB; Cache-Dateigröße: 3,3 MB
Besser als msg pack. Dies erfordert jedoch auch das Kompilieren.
serialize
/.unserialize
durchschnittliche Zeit: 477,2 ms; Speichernutzung: 36,25 MB; Cache-Dateigröße: 5,9 MB
Bessere Leistungen als JSON, je größer das Array ist, desto langsamer json_decode
ist es, aber das ist Ihnen bereits neu.
Diese externen Erweiterungen verringern die Dateigröße und scheinen auf dem Papier großartig zu sein. Zahlen lügen nicht *. Was bringt es, eine Erweiterung zu kompilieren, wenn Sie fast die gleichen Ergebnisse erzielen, die Sie mit einer Standard-PHP-Funktion erzielen würden?
Wir können auch ableiten, dass Sie je nach Ihren Bedürfnissen etwas anderes wählen als jemand anderes:
- IgBinary ist wirklich nett und bietet eine bessere Leistung als MsgPack
- Msgpack kann Ihre Daten besser komprimieren (beachten Sie, dass ich die Option igbinary compact.string nicht ausprobiert habe).
- Willst du nicht kompilieren? Verwenden Sie Standards.
Das war's, ein weiterer Vergleich der Serialisierungsmethoden, der Ihnen bei der Auswahl hilft!
* Getestet mit PHPUnit 3.7.31, PHP 5.5.10 - nur Dekodierung mit einer Standard-Festplatte und einer alten Dual-Core-CPU - durchschnittliche Anzahl bei 10 gleichen Anwendungsfalltests, Ihre Statistiken können unterschiedlich sein
JSON_UNESCAPED_UNICODE
.