Argomento davvero carino e dopo aver letto le poche risposte, voglio condividere i miei esperimenti sull'argomento.
Ho un caso d'uso in cui è necessario interrogare una tabella "enorme" quasi ogni volta che parlo con il database (non chiedo perché, solo un dato di fatto). Il sistema di cache del database non è appropriato in quanto non memorizzerà nella cache le diverse richieste, quindi ho pensato ai sistemi di cache php.
Ho provato apcu
ma non si adattava alle esigenze, la memoria non è abbastanza affidabile in questo caso. Il passo successivo è stato quello di memorizzare nella cache un file con serializzazione.
La tabella ha 14355 voci con 18 colonne, questi sono i miei test e le statistiche sulla lettura della cache serializzata:
JSON:
Come hai detto, l'inconveniente maggiore di json_encode
/ json_decode
è che trasforma tutto in StdClass
un'istanza (o Oggetto). Se è necessario eseguirne il loop, trasformarlo in un array è ciò che probabilmente si farà e, sì, sta aumentando il tempo di trasformazione
tempo medio: 780,2 ms; uso della memoria: 41,5 MB; dimensione del file cache: 3,8 MB
Msgpack
@hutch menziona msgpack . Sito Web grazioso. Facciamo una prova, vero?
tempo medio: 497 ms; uso della memoria: 32 MB; dimensione del file cache: 2,8 MB
Va meglio, ma richiede una nuova estensione; compilare persone a volte spaventate ...
IgBinary
@GingerDog menziona igbinary . Si noti che ho impostato il igbinary.compact_strings=Off
perché mi interessa di più leggere le prestazioni piuttosto che le dimensioni del file.
tempo medio: 411,4 ms; uso della memoria: 36,75 MB; dimensione del file cache: 3,3 MB
Meglio del pacchetto msg. Tuttavia, anche questo richiede la compilazione.
serialize
/unserialize
tempo medio: 477,2 ms; uso della memoria: 36,25 MB; dimensione del file cache: 5,9 MB
Prestazioni migliori rispetto a JSON, più grande è l'array, più lento json_decode
è, ma lo sai già.
Quelle estensioni esterne stanno restringendo le dimensioni del file e sembrano grandi sulla carta. I numeri non mentono *. A che serve compilare un'estensione se si ottengono quasi gli stessi risultati che si otterrebbero con una funzione PHP standard?
Possiamo anche dedurre che, in base alle tue esigenze, sceglierai qualcosa di diverso rispetto a qualcun altro:
- IgBinary è davvero bello e funziona meglio di MsgPack
- Msgpack è meglio nel comprimere i tuoi dati (nota che non ho provato l'opzione igbinary compact.string).
- Non vuoi compilare? Usa gli standard.
Ecco, un altro confronto tra i metodi di serializzazione per aiutarti a scegliere quello!
* Testato con PHPUnit 3.7.31, php 5.5.10 - solo decodifica con hard disk standard e vecchia CPU dual core - numeri medi su 10 test dello stesso caso d'uso, le tue statistiche potrebbero essere diverse
JSON_UNESCAPED_UNICODE
.