La méthode préférée pour stocker les tableaux PHP (json_encode vs sérialiser)
J'ai besoin de stocker un multi-dimensionnelle tableau associatif de données dans un fichier plat pour la mise en cache. Je pourrais parfois rencontré le besoin de le convertir en JSON pour les utiliser dans mon application web, mais la grande majorité du temps, je serai à l'aide de la matrice directement dans PHP.
Serait-il plus efficace pour stocker le tableau JSON ou en PHP tableau sérialisé dans ce fichier texte? J'ai regardé autour et il semble que dans les dernières versions de PHP (5.3), json_decode
est effectivement plus rapide que unserialize
.
Je suis actuellement penchée vers le stockage de la matrice comme JSON que je ressens sa plus facile à lire par un humain, si nécessaire, il peut être utilisé en PHP et en JavaScript avec très peu d'effort, et de ce que j'ai lu, il pourrait même être plus rapide à décoder (pas sûr de l'encodage, tout de même).
Personne ne sait de toute pièges? N'importe qui ont de bons repères pour montrer les avantages de performance de la méthode?
Vous devez vous connecter pour publier un commentaire.
Dépend de vos priorités.
Si la performance est votre absolu de conduite caractéristique, puis par tous les moyens l'utilisation la plus rapide possible. Assurez-vous juste que vous avez une pleine compréhension des différences avant de faire un choix
serialize()
vous devez ajouter un paramètre supplémentaire pour garder les caractères UTF-8 intacte:json_encode($array, JSON_UNESCAPED_UNICODE)
(sinon, il convertit les caractères UTF-8 Unicode séquences d'échappement).__sleep()
et__wakeup()
avec JSONPHP>=5.4
vous pouvez mettre en œuvre JsonSerializable pour modifier ce comportement).Et il y a probablement quelques autres différences que je ne peux pas penser pour le moment.
Un simple test de vitesse de comparer les deux
JSON_UNESCAPED_UNICODE
.json_encode
) et c'est avec une moyenne d'environ 131% plus rapide que sérialiser maintenant. Donc, il doit y avoir quelques très belles améliorations pour que la fonction de la 5.4.x 5.3.x. Plus précisément, je suis en cours d'exécution 5.4.24 sur CentOS 6. Ainsi, yay pour JSON!!PHP 5.5.21
:json_encode
est de 120 à 240% plus rapide queserialize
, tandis queunserialize
est de 40 à 50% plus rapide quejson_decode
.serialize() was roughly 35.04% faster than json_encode()
JSON encoded in 0.036638021469116 seconds PHP serialized in 0.027013063430786 seconds serialize() was roughly 35.63% faster than json_encode()
JSON est plus simple et plus rapide que PHP est le format de sérialisation et doit être utilisé sauf:
json_decode()
: "Cette fonction retourne false si les données encodées JSON est plus profond que 127 éléments."J'ai écrit un billet de blog sur ce sujet: "Cache un grand tableau: JSON, sérialiser ou var_export?". Dans ce post, il est montré que serialize est le meilleur choix pour de petits ou de grands tableaux. Pour les tableaux de très grande taille (> 70 MO) JSON est le meilleur choix.
json_encode()
est sur le 80% à 150% le plus rapide (c'est vraiment d'aller en haut et en bas) queserialize()
, avec environ 300 itérations. Mais lors de l'utilisation des ensembles les plus petits (array("teams" => array(1 => array(4 arrays of players), 2 => array(4 arrays of players)))
), j'ai fait le test avec de 750 000 itérations etserialize()
est sur le 6% à 10% le plus rapide dans ce cas. Ma fonction prend le temps moyen pour toutes les itérations et les compare. Je pourrais le poster ici comme l'une des réponsesVous pourriez également être intéressé par https://github.com/phadej/igbinary - qui fournit une autre sérialisation "moteur" pour PHP.
Mon random/arbitraire de la "performance" des chiffres, à l'aide de PHP 5.3.5 sur une plate-forme 64 bits spectacle :
JSON :
Natives de PHP :
Igbinary :
Donc, c'est plus rapide de igbinary_serialize() et igbinary_unserialize() et utilise moins d'espace disque.
J'ai utilisé le fillArray(0, 3) code comme ci-dessus, mais a rendu les clés du tableau des chaînes plus longues.
igbinary peut conserver les mêmes types de données que PHP natif de sérialiser peut (Donc pas de problème avec les objets, etc) et vous pouvez dire à PHP5.3 à l'utiliser pour le gestionnaire de session si vous le souhaitez.
Voir aussi http://ilia.ws/files/zendcon_2010_hidden_features.pdf - spécifiquement diapositives 14/15/16
Y viens de tester sérialisé et json de coder et de décoder, en plus de la taille, il prendra la chaîne stockée.
Nous pouvons conclure que JSON-encode plus rapide et les résultats d'un petit string, mais unserialize est plus rapide à décoder la chaîne.
Si vous êtes à la mise en cache des informations que vous voulez finalement à "inclure" à un moment plus tard dans le temps, vous pouvez essayer d'utiliser var_export. De cette façon, vous ne prenez que le frapper dans le "sérialiser" et pas dans le "unserialize".
J'ai enrichi le test d'inclure unserialization performance. Voici les numéros que j'ai eu.
Donc json semble être plus rapide pour l'encodage, mais lente dans le décodage. Ainsi, il pourrait dépendre de votre application et de ce que vous attendez le plus.
Vraiment beau sujet et après avoir lu les quelques réponses, je veux partager mes expériences sur le sujet.
J'ai eu un cas d'utilisation où certains "grands" de la table doit être interrogé presque à chaque fois que je parle à la base de données (ne me demandez pas pourquoi, juste un fait). La base de données du système de mise en cache n'est pas approprié car il ne vais pas mettre en cache les différentes demandes, si j'ai bien autour de php et de systèmes de mise en cache.
J'ai essayé
apcu
mais il ne correspondait pas aux besoins, la mémoire n'est pas assez fiable dans ce cas. Prochaine étape était de cache dans un fichier avec la sérialisation.Table a 14355 entrées avec 18 colonnes, ceux sont mes tests et des statistiques sur la lecture de la sérialisé cache:
JSON:
Comme vous l'avez tous dit, l'inconvénient majeur avec
json_encode
/json_decode
est qu'il transforme tout d'unStdClass
instance (ou un Objet). Si vous avez besoin d'une boucle, elle, de le transformer à un tableau est ce que vous allez probablement faire, et oui ça augmente le temps de transformationMsgpack
@huche mentionne msgpack. Joli site web. Nous allons lui donner un essai allons-nous?
C'est mieux, mais nécessite une nouvelle extension; la compilation parfois peur des gens...
IgBinary
@GingerDog mentionne igbinary. Notez que j'ai mis le
igbinary.compact_strings=Off
parce que je me soucie plus sur les performances de lecture de la taille du fichier.Mieux que le msg pack. Pourtant, celui-ci, il faut compiler trop.
serialize
/unserialize
De meilleures performances que le JSON, plus le tableau est plus lent
json_decode
est, mais vous avez déjà de nouvelles.Ceux de l'extérieur sont les extensions de rétrécir la taille du fichier et semble grande sur le papier. Les chiffres ne mentent pas*. Quel est le point de compiler une extension si vous obtenez à peu près les mêmes résultats que vous auriez en standard avec une fonction PHP?
Nous pouvons également en déduire que, en fonction de vos besoins, vous pourrez choisir quelque chose de différent de quelqu'un d'autre:
compact.option de chaîne).
Que c'est, un autre méthodes de sérialisation de comparaison pour vous aider à choisir celui!
*Testé avec PHPUnit 3.7.31, php 5.5.10 - décodage seulement avec un standard hardrive et vieux PROCESSEUR dual core - nombre moyen sur 10 même cas d'utilisation des tests, vos données peuvent être différentes
json_decode($object, true)
, fondamentalement, il va faire la même chose que(array) json_decode($object)
mais de manière récursive alors que ce serait le même comportement va avoir un coût significatif dans les deux cas. Notez que je n'ai pas testé les performances de diff entreStdClass
etarray
mais c'est pas vraiment le sujet ici.Semble que serialize est celui que je vais utiliser pour 2 raisons:
Quelqu'un a fait remarquer que unserialize est plus rapide que la fonction json_decode et un "lire" cas semble plus probable qu'un 'écrire' cas.
J'ai eu du mal avec json_encode quand avoir des chaînes de caractères non UTF-8 caractères. Lorsque cela se produit, la chaîne finit par être vide, entraînant une perte de l'information.
J'ai testé cela à très bien sur une assez complexe, légèrement imbriquées multi-hash avec toutes sortes de données (chaîne, NULL, entiers), et serialize/unserialize terminé beaucoup plus vite que les json_encode/json_decode.
Le seul avantage json avoir dans mes tests, c'est plus petit "paniers" taille.
Celles-ci sont faites en vertu de PHP 5.3.3, laissez-moi savoir si vous voulez plus de détails.
Voici les résultats des tests puis le code pour les produire. Je ne peux pas fournir les données d'essai puisqu'il avait révéler des informations que je ne peux pas lâcher dans la nature.
J'ai fait un petit test ainsi. Mes résultats étaient les mêmes. Mais j'ai besoin de le décoder les performances. Où j'ai remarqué, que quelques personnes ci-dessus dit ainsi,
unserialize
est plus rapide quejson_decode
.unserialize
prend environ 60-70% de lajson_decode
temps. Donc la conclusion est assez simple:Lorsque vous avez besoin de la performance dans l'encodage, l'utilisation
json_encode
, lorsque vous avez besoin de performances lors du décodage, l'utilisationunserialize
. Parce que vous ne pouvez pas fusionner les deux fonctions que vous avez à faire un choix lorsque vous avez besoin de plus de performance.Mon point de repère dans pseudo:
Sur avarage: unserialize remporté 96 fois plus de 4 fois la fonction json_decode. Avec un avarage de près de 1,5 ms à plus de 2,5 ms.
Avant de prendre votre décision finale, sachez que le format JSON n'est pas sans danger pour les tableaux associatifs -
json_decode()
sera de retour comme des objets à la place:De sortie est:
json_encode
était un tableau associatif, vous pouvez facilement la force de retour dans un tableau comme suit:$json = json_encode($some_assoc_array); $back_to_array = (array)json_decode($json);
Aussi il est bon de noter que vous pouvez accéder à des objets de la même façon que les tableaux en PHP donc dans un scénario typique, on ne sauriez même pas la différence. Bon point tout de même!Découvrez les résultats ici (désolé pour le hack de mettre le code PHP dans le code JS à cocher):
http://jsfiddle.net/newms87/h3b0a0ha/embedded/result/
RÉSULTATS:
serialize()
etunserialize()
sont à la fois beaucoup plus rapide dans le PHP 5.4 sur des tableaux de taille variable.J'ai fait un script de test sur les données du monde réel pour comparer json_encode vs sérialiser et json_decode vs unserialize. Le test a été exécuté sur le système de mise en cache d'une production de site e-commerce. Il faut simplement les données qui sont déjà dans le cache, et les tests à la fois pour encoder /décoder (ou serialize /unserialize) toutes les données et je l'ai mis dans un format facile à voir le tableau.
J'ai couru ce sur PHP 5.4 serveur d'hébergement mutualisé.
Les résultats ont été très concluants que pour ces grands aux petits ensembles de données serialize et unserialize ont été les grands vainqueurs. En particulier, pour mon cas d'utilisation, la fonction json_decode et unserialize sont les plus importants pour le système de mise en cache. Unserialize était presque omniprésente gagnant ici. Il est généralement de 2 à 4 fois (parfois 6 ou 7 fois) aussi rapide que la fonction json_decode.
Il est intéressant de noter la différence dans les résultats de @pierre-bailey.
Voici le code PHP utilisé pour générer les résultats:
juste un avis, si vous voulez sérialiser vos données à quelque chose de facile à lire et à comprendre comme JSON, mais avec plus de compression et de performances plus élevées, vous devriez vérifier messagepack.
Tout d'abord, j'ai modifié le script pour faire un peu plus de benchmarking (et aussi faire de la 1000 pistes au lieu de simplement 1):
J'ai utilisé cette version de PHP 7:
Et mes résultats étaient les suivants:
Donc clairement, serialize/unserialize est le plus rapide méthode, tandis que json_encode/décodage est le la plupart des appareils portables.
Si vous imaginez un scénario où vous lecture/écriture de données sérialisées 10x ou plus souvent que vous avez besoin d'envoyer ou de recevoir à partir d'un non-système PHP, vous êtes TOUJOURS préférable d'utiliser serialize/unserialize et l'ont json_encode ou json_decode avant la sérialisation en termes de temps.
JSON est mieux si vous voulez sauvegarder les Données et de les restaurer sur un autre ordinateur ou via FTP.
Par exemple avec sérialiser si vous stockez des données sur un serveur Windows, télécharger via FTP et de le restaurer sur un Linux un, il pourrait ne plus fonctionner en raison du caractere ré-encodage, car sérialiser les magasins de la longueur des chaînes de caractères et Unicode > UTF-8 transcodage certains 1 octet personnage pourrait devint 2 octets, ce qui en fait l'algorithme de collision.
THX pour ce cas-test code:
Mes résultats sur le tableau que j'utilise pour la configuration comme la jachère:
JSON codé en 0.0031511783599854 secondes
PHP sérialisé dans 0.0037961006164551 secondes
json_encode()
était à peu près 20.47% plus rapide queserialize()
JSON codé en 0.0070841312408447 secondes
PHP sérialisé dans 0.0035839080810547 secondes
unserialize()
était à peu près 97.66% plus rapide quejson_encode()
Soi - essai sur vos propres données.
Si summ jusqu'à ce que les gens disent ici, la fonction json_decode/encode semble plus rapide que serialize/unserialize MAIS
Si vous ne var_dump le type de l'objet sérialisé est changé.
Si pour une raison quelconque vous souhaitez conserver le type, aller avec sérialiser!
(essayez par exemple stdClass vs array)
serialize/unserialize:
json encoder/décoder
Comme vous pouvez le voir le json_encode/décoder convertit tous à stdClass, qui n'est pas bon, l'objet d'infos perdu... Alors décider sur la base des besoins, surtout si elle n'est pas seulement des tableaux...
Je vous suggère d'utiliser Super Cache, qui est un fichier de mécanisme de cache qui ne l'utiliseront pas
json_encode
ouserialize
. Il est simple à utiliser et très rapide comparé à d'autres PHP mécanisme de Cache.https://packagist.org/packages/smart-php/super-cache
Ex: