Cela dépend de vos priorités.
Si la performance est votre caractéristique de conduite absolue, utilisez certainement la plus rapide. Assurez-vous de bien comprendre les différences avant de faire un choix
- Contrairement à
serialize()
vous devez ajouter un paramètre supplémentaire pour garder les caractères UTF-8 intacts: json_encode($array, JSON_UNESCAPED_UNICODE)
(sinon il convertit les caractères UTF-8 en séquences d'échappement Unicode).
- JSON n'aura aucune mémoire de ce qu'était la classe d'origine de l'objet (ils sont toujours restaurés en tant qu'instances de stdClass).
- Vous ne pouvez pas exploiter
__sleep()
et __wakeup()
avec JSON
- Par défaut, seules les propriétés publiques sont sérialisées avec JSON. (
PHP>=5.4
vous pouvez implémenter JsonSerializable pour changer ce comportement).
- JSON est plus portable
Et il y a probablement quelques autres différences auxquelles je ne peux pas penser en ce moment.
Un test de vitesse simple pour comparer les deux
<?php
ini_set('display_errors', 1);
error_reporting(E_ALL);
// Make a big, honkin test array
// You may need to adjust this depth to avoid memory limit errors
$testArray = fillArray(0, 5);
// Time json encoding
$start = microtime(true);
json_encode($testArray);
$jsonTime = microtime(true) - $start;
echo "JSON encoded in $jsonTime seconds\n";
// Time serialization
$start = microtime(true);
serialize($testArray);
$serializeTime = microtime(true) - $start;
echo "PHP serialized in $serializeTime seconds\n";
// Compare them
if ($jsonTime < $serializeTime) {
printf("json_encode() was roughly %01.2f%% faster than serialize()\n", ($serializeTime / $jsonTime - 1) * 100);
}
else if ($serializeTime < $jsonTime ) {
printf("serialize() was roughly %01.2f%% faster than json_encode()\n", ($jsonTime / $serializeTime - 1) * 100);
} else {
echo "Impossible!\n";
}
function fillArray( $depth, $max ) {
static $seed;
if (is_null($seed)) {
$seed = array('a', 2, 'c', 4, 'e', 6, 'g', 8, 'i', 10);
}
if ($depth < $max) {
$node = array();
foreach ($seed as $key) {
$node[$key] = fillArray($depth + 1, $max);
}
return $node;
}
return 'empty';
}
JSON_UNESCAPED_UNICODE
.json_encode
) et c'est en moyenne 131% plus rapide que la sérialisation maintenant. Donc, il doit y avoir de très belles améliorations à cette fonction dans 5.4.x sur 5.3.x. Plus précisément, j'utilise 5.4.24 sur CentOS 6. Alors, oui pour JSON !!serialize() was roughly 35.04% faster than json_encode()
JSON est plus simple et plus rapide que le format de sérialisation de PHP et doit être utilisé sauf si :
json_decode()
:: "Cette fonction retournera false si les données encodées JSON sont plus profondes que 127 éléments."la source
J'ai écrit un article sur ce sujet:
" Mettre en cache un grand tableau: JSON, serialize ou var_export? ". Dans cet article, il est montré que la sérialisation est le meilleur choix pour les baies de petite à grande taille. Pour les très grands tableaux (> 70 Mo), JSON est le meilleur choix.la source
json_encode()
c'est environ 80% à 150% plus rapide ( ça monte et descend vraiment là-bas)serialize()
qu'avec environ 300 itérations. Mais lorsquearray("teams" => array(1 => array(4 arrays of players), 2 => array(4 arrays of players)))
j'utilise les petits tableaux ( ), j'ai testé avec 750 000 itérations etserialize()
est environ 6% à 10% plus rapide dans ce cas. Ma fonction prend le temps moyen pour toutes les itérations et les compare. Je pourrais l'afficher ici comme l'une des réponsesVous pourriez aussi être intéressé par https://github.com/phadej/igbinary - qui fournit un «moteur» de sérialisation différent pour PHP.
Mes chiffres de performances aléatoires / arbitraires, en utilisant PHP 5.3.5 sur une plate-forme 64 bits, montrent:
JSON:
PHP natif:
Igbinaire:
Ainsi, il est plus rapide d'igbinary_serialize () et igbinary_unserialize () et utilise moins d'espace disque.
J'ai utilisé le code fillArray (0, 3) comme ci-dessus, mais j'ai rendu les clés de tableau plus longues.
igbinary peut stocker les mêmes types de données que la sérialisation native de PHP (donc pas de problème avec les objets, etc.) et vous pouvez dire à PHP5.3 de l'utiliser pour la gestion de session si vous le souhaitez.
Voir également http://ilia.ws/files/zendcon_2010_hidden_features.pdf - en particulier les diapositives 14/15/16
la source
Y vient de tester le codage et le décodage sérialisé et json, plus la taille de la chaîne stockée.
Nous pouvons conclure que JSON code plus rapidement et produit une chaîne plus petite, mais la désérialisation est plus rapide pour décoder la chaîne.
la source
Si vous mettez en cache des informations que vous souhaiterez finalement "inclure" à un moment ultérieur, vous pouvez essayer d'utiliser var_export . De cette façon, vous ne prenez le coup que dans la "sérialisation" et non dans la "désérialisation".
la source
J'ai augmenté le test pour inclure les performances de désérialisation. Voici les chiffres que j'ai obtenus.
Json semble donc être plus rapide pour l'encodage mais lent pour le décodage. Cela peut donc dépendre de votre application et de ce que vous comptez faire le plus.
la source
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 uneStdClass
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 transformationMsgpack
@hutch mentionne msgpack . Joli site Web. Essayons-nous?
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.Mieux que le pack msg. Pourtant, celui-ci nécessite également une compilation.
serialize
/unserialize
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:
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
la source
json_decode($object, true)
, fondamentalement, cela fera la même chose que(array) json_decode($object)
mais récursivement, ce serait donc le même comportement et cela aura un coût important dans les deux cas. Notez que je n'ai pas testé les différences de performances entreStdClass
etarray
mais ce n'est pas vraiment le point ici.On dirait que sérialiser est celui que je vais utiliser pour 2 raisons:
Quelqu'un a souligné que la désérialisation est plus rapide que json_decode et qu'un cas de «lecture» semble plus probable qu'un cas «d'écriture».
J'ai eu des problèmes avec json_encode lorsque j'ai des chaînes avec des caractères UTF-8 invalides. Lorsque cela se produit, la chaîne finit par être vide, ce qui entraîne une perte d'informations.
la source
J'ai testé cela très soigneusement sur un multi-hachage assez complexe et légèrement imbriqué avec toutes sortes de données (chaîne, NULL, entiers), et sérialiser / désérialiser s'est terminé beaucoup plus rapidement que json_encode / json_decode.
Le seul avantage que json a dans mes tests est sa taille plus compacte.
Celles-ci sont effectuées sous PHP 5.3.3, faites-moi savoir si vous souhaitez plus de détails.
Voici les résultats des tests puis le code pour les produire. Je ne peux pas fournir les données de test car cela révélerait des informations que je ne peux pas laisser sortir dans la nature.
la source
J'ai également fait une petite référence. Mes résultats étaient les mêmes. Mais j'ai besoin des performances de décodage. Là où j'ai remarqué, comme l'ont dit quelques personnes ci-dessus aussi,
unserialize
c'est plus rapide quejson_decode
.unserialize
prend environ 60 à 70% dujson_decode
temps. La conclusion est donc assez simple: lorsque vous avez besoin de performances dans le codage, utilisezjson_encode
, lorsque vous avez besoin de performances lors du décodage, utilisezunserialize
. Parce que vous ne pouvez pas fusionner les deux fonctions, vous devez faire un choix là où vous avez besoin de plus de performances.Ma référence en pseudo:
En moyenne: unserialize a remporté 96 fois plus de 4 fois le json_decode. Avec une moyenne d'environ 1,5 ms sur 2,5 ms.
la source
Avant de prendre votre décision finale, sachez que le format JSON n'est pas sûr pour les tableaux associatifs -
json_decode()
les renverra en tant qu'objets à la place:La sortie est:
la source
json_encode
était un tableau associatif, vous pouvez facilement le forcer à revenir dans un tableau comme ceci:$json = json_encode($some_assoc_array); $back_to_array = (array)json_decode($json);
il est également bon de noter que vous pouvez accéder aux objets de la même manière que les tableaux en PHP, donc dans un scénario typique, on ne connaîtrait même pas la différence. Bon point cependant!Tout d'abord, j'ai changé le script pour faire un peu plus de benchmarking (et aussi faire 1000 runs au lieu de 1):
J'ai utilisé cette version de PHP 7:
Et mes résultats étaient:
Il est donc clair que serialize / unserialize est la méthode la plus rapide , tandis que json_encode / decode est la plus portable.
Si vous envisagez un scénario dans lequel vous lisez / écrivez des données sérialisées 10 fois ou plus souvent que ce que vous devez envoyer ou recevoir depuis un système non PHP, vous feriez TOUJOURS mieux d'utiliser sérialiser / désérialiser et de l'avoir json_encode ou json_decode avant la sérialisation en termes de temps.
la source
Découvrez les résultats ici (désolé pour le piratage mettant le code PHP dans la boîte de code JS):
http://jsfiddle.net/newms87/h3b0a0ha/embedded/result/
RÉSULTATS:
serialize()
etunserialize()
sont tous deux beaucoup plus rapides en PHP 5.4 sur des tableaux de taille variable.J'ai fait un script de test sur des données du monde réel pour comparer json_encode vs serialize et json_decode vs unserialize. Le test a été exécuté sur le système de mise en cache d'un site de commerce électronique en production. Il prend simplement les données déjà dans le cache et teste les temps pour encoder / décoder (ou sérialiser / désérialiser) toutes les données et je les mets dans un tableau facile à voir.
Je l'ai exécuté sur un serveur d'hébergement partagé PHP 5.4.
Les résultats ont été très concluants que pour ces grands et petits ensembles de données, la sérialisation et la désérialisation étaient les gagnants clairs. En particulier pour mon cas d'utilisation, json_decode et unserialize sont les plus importants pour le système de mise en cache. Unserialize était presque un gagnant omniprésent ici. Il était généralement 2 à 4 fois (parfois 6 ou 7 fois) aussi rapide que json_decode.
Il est intéressant de noter la différence de résultats de @ peter-bailey.
Voici le code PHP utilisé pour générer les résultats:
la source
juste un fyi - si vous voulez sérialiser vos données en quelque chose de facile à lire et à comprendre comme JSON mais avec plus de compression et de meilleures performances, vous devriez vérifier messagepack.
la source
JSON est préférable si vous souhaitez sauvegarder des données et les restaurer sur une autre machine ou via FTP.
Par exemple, avec sérialiser si vous stockez des données sur un serveur Windows, téléchargez-les via FTP et restaurez-les sur un serveur Linux, cela ne pourrait plus fonctionner en raison du recodage du caractère, car sérialiser stocke la longueur des chaînes et dans l'Unicode > Le transcodage UTF-8 de certains caractères de 1 octet pourrait devenir long de 2 octets, ce qui ferait planter l'algorithme.
la source
THX - pour ce code de référence:
Mes résultats sur la baie que j'utilise pour la configuration sont comme des jachères: JSON encodé en 0,0031511783599854 secondes
PHP sérialisé en 0,0037961006164551 secondes
json_encode()
était environ 20,47% plus rapide queserialize()
JSON encodé en 0,0070841312408447 secondesPHP sérialisé en 0,0035839080810547 secondes
unserialize()
était environ 97,66% plus rapide quejson_encode()
Alors - testez-le sur vos propres données.
la source
Si pour résumer ce que les gens disent ici, json_decode / encode semble plus rapide que serialize / unserialize MAIS Si vous faites var_dump le type de l'objet sérialisé est changé. Si pour une raison quelconque vous souhaitez conserver le type, optez pour la sérialisation!
(essayez par exemple stdClass vs array)
sérialiser / désérialiser:
codage / décodage json
Comme vous pouvez le voir, json_encode / decode convertit tout en stdClass, ce qui n'est pas si bon, les informations d'objet sont perdues ... Alors décidez en fonction des besoins, surtout s'il ne s'agit pas que de tableaux ...
la source
Je vous suggère d'utiliser Super Cache, qui est un mécanisme de cache de fichiers qui n'utilisera pas
json_encode
ouserialize
. Il est simple à utiliser et très rapide par rapport aux autres mécanismes de cache PHP.https://packagist.org/packages/smart-php/super-cache
Ex:
la source