Sujet vraiment sympa et après avoir lu les quelques réponses, je souhaite partager mes expériences sur le sujet.
J'ai un cas d'utilisation où une table "énorme" doit être interrogée presque chaque fois que je parle à la base de données (ne demandez pas pourquoi, juste un fait). Le système de mise en cache de la base de données n'est pas approprié car il ne mettra pas en cache les différentes demandes, donc j'ai pensé aux systèmes de mise en cache php.
J'ai essayé apcu
mais cela ne correspondait pas aux besoins, la mémoire n'est pas assez fiable dans ce cas. L'étape suivante consistait à mettre en cache dans un fichier avec la sérialisation.
Le tableau a 14355 entrées avec 18 colonnes, ce sont mes tests et statistiques sur la lecture du cache sérialisé:
JSON:
Comme vous l'avez tous dit, le principal inconvénient de json_encode
/ json_decode
est qu'il transforme tout en une StdClass
instance (ou un objet). Si vous avez besoin de le boucler, le transformer en un tableau est ce que vous ferez probablement, et oui, cela augmente le temps de transformation
temps moyen: 780,2 ms; utilisation de la mémoire: 41,5 Mo; taille du fichier cache: 3,8 Mo
Msgpack
@hutch mentionne msgpack . Joli site Web. Essayons-nous?
temps moyen: 497 ms; utilisation de la mémoire: 32 Mo; taille du fichier cache: 2,8 Mo
C'est mieux, mais nécessite une nouvelle extension; compiler des gens parfois effrayés ...
IgBinary
@GingerDog mentionne l' igbinary . Notez que j'ai défini le igbinary.compact_strings=Off
car je me soucie plus des performances de lecture que de la taille du fichier.
temps moyen: 411,4 ms; utilisation de la mémoire: 36,75 Mo; taille du fichier cache: 3,3 Mo
Mieux que le pack msg. Pourtant, celui-ci nécessite également une compilation.
serialize
/unserialize
temps moyen: 477,2 ms; utilisation de la mémoire: 36,25 Mo; taille du fichier cache: 5,9 Mo
Meilleures performances que JSON, plus la baie est grande, plus lentement json_decode
est , mais vous l'avez déjà fait.
Ces extensions externes réduisent la taille du fichier et semblent excellentes sur le papier. Les chiffres ne mentent pas *. Quel est l'intérêt de compiler une extension si vous obtenez presque les mêmes résultats que vous obtiendriez avec une fonction PHP standard?
On peut également en déduire qu'en fonction de vos besoins, vous choisirez quelque chose de différent de quelqu'un d'autre:
- IgBinary est vraiment agréable et fonctionne mieux que MsgPack
- Msgpack est meilleur pour compresser vos données (notez que je n'ai pas essayé l'option igbinary compact.string).
- Vous ne voulez pas compiler? Utilisez des normes.
Voilà, une autre comparaison des méthodes de sérialisation pour vous aider à choisir celle-là!
* Testé avec PHPUnit 3.7.31, php 5.5.10 - décodage uniquement avec un disque dur standard et un ancien processeur dual core - en moyenne sur 10 tests de cas d'utilisation, vos statistiques peuvent être différentes
JSON_UNESCAPED_UNICODE
.