web-dev-qa-db-fra.com

Méthode préférée pour stocker PHP tableaux (json_encode vs serialize)

J'ai besoin de stocker un tableau associatif multidimensionnel de données dans un fichier plat à des fins de mise en cache. Je peux parfois avoir besoin de le convertir en JSON pour l'utiliser dans mon application Web, mais la grande majorité du temps, j'utiliserai le tableau directement en PHP.

Serait-il plus efficace de stocker le tableau en JSON ou en tant que PHP tableau sérialisé dans ce fichier texte? J'ai regardé autour de moi et il semble que dans les dernières versions de PHP (5.3), json_decode est en réalité plus rapide que unserialize.

Je suis actuellement enclin à stocker le tableau en JSON, car j'estime qu'il est plus facile à lire par un humain si nécessaire, il peut être utilisé à la fois PHP et JavaScript avec très peu d'effort, et d'après ce que j'ai déjà vu lire, il pourrait même être plus rapide à décoder (pas sûr de l’encodage, cependant).

Est-ce que quelqu'un connaît des pièges? Quelqu'un at-il de bons points de repère pour montrer les avantages de performance de l'une ou l'autre méthode?

571
KyleFarris

Cela dépend de vos priorités.

Si la performance est votre caractéristique de conduite absolue, utilisez la plus rapide. Assurez-vous simplement de bien comprendre les différences avant de faire un choix.

  • Contrairement à serialize(), vous devez ajouter un paramètre supplémentaire pour que les caractères UTF-8 soient intacts: json_encode($array, JSON_UNESCAPED_UNICODE) (sinon, les caractères UTF-8 sont convertis en séquences d'échappement Unicode).
  • JSON n'aura aucune mémoire sur la classe d'origine de l'objet (elles sont toujours restaurées en tant qu'instances de stdClass).
  • Vous ne pouvez pas utiliser __sleep() et __wakeup() avec JSON
  • Par défaut, seules les propriétés publiques sont sérialisées avec JSON. (dans 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 pour le 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';
}
534
Peter Bailey

JSON est plus simple et plus rapide que le format de sérialisation PHP et devrait être utilisé sauf si:

  • Vous stockez des tableaux profondément imbriqués: json_decode() : "Cette fonction renverra false si les données codées JSON dépassent 127 éléments."
  • Vous stockez des objets qui doivent être non sérialisés en tant que classe correcte
  • Vous interagissez avec d'anciennes versions PHP qui ne prennent pas en charge json_decode.
232
Greg

J'ai écrit un article sur ce sujet: " Cache un grand tableau: JSON, sérialiser ou var_export? ". Dans cet article, il est montré que la sérialisation est le meilleur choix pour les baies de taille petite à grande. Pour les très grands réseaux (> 70 Mo), JSON est le meilleur choix.

58
Taco

Vous pourriez également être intéressé par https://github.com/phadej/igbinary - qui fournit un "moteur" de sérialisation différent pour PHP.

Mes performances aléatoires/arbitraires, en utilisant PHP 5.3.5 sur une plate-forme 64 bits:

JSON:

  • JSON encodé en 2.180496931076 secondes
  • JSON décodé en 9.8368630409241 secondes
  • taille "String" sérialisée: 13993

Natif PHP:

  • PHP sérialisé en 2.9125759601593 secondes
  • PHP non sérialisé en 6.4348418712616 secondes
  • sérialisé "String" taille: 20769

Igbinary:

  • WIN igbinary sérialisé en 1.6099879741669 secondes
  • WIN igbinrary non sérialisée en 4.7737920284271 secondes
  • GAGNE sérialisé "String" Taille: 4467

Ainsi, il est plus rapide d’igbinary_serialize () et d’igbinary_unserialize () et utilise moins d’espace disque.

J'ai utilisé le code fillArray (0, 3) comme ci-dessus, mais les chaînes du tableau ont été allongées.

igbinary peut stocker les mêmes types de données que la sérialisation native de PHP (aucun problème avec les objets, etc.) et vous pouvez dire à PHP 5.3 de l'utiliser pour la gestion de session si vous le souhaitez.

Voir aussi http://ilia.ws/files/zendcon_2010_hidden_features.pdf - spécifiquement les diapositives 14/15/16

51
David Goodwin

Y vient de tester l’encodage et le décodage sérialisés et json, ainsi que la taille de la chaîne stockée.

JSON encoded in 0.067085981369 seconds. Size (1277772)
PHP serialized in 0.12110209465 seconds. Size (1955548)
JSON decode in 0.22470498085 seconds
PHP serialized in 0.211947917938 seconds
json_encode() was roughly 80.52% faster than serialize()
unserialize() was roughly 6.02% faster than json_decode()
JSON string was roughly 53.04% smaller than Serialized string

Nous pouvons en conclure que JSON encode plus rapidement et donne une chaîne plus petite, mais la désérialisation est plus rapide pour le décoder.

24
Blunk

Si vous mettez en cache des informations que vous voudrez finalement "inclure" ultérieurement, essayez d’utiliser var_export . De cette façon, vous ne prenez que le hit dans la "sérialisation" et non dans la "unserialize".

15
Jordan S. Jones

J'ai augmenté le test pour inclure les performances de désérialisation. Voici les chiffres que j'ai obtenus.

Serialize

JSON encoded in 2.5738489627838 seconds
PHP serialized in 5.2861361503601 seconds
Serialize: json_encode() was roughly 105.38% faster than serialize()


Unserialize

JSON decode in 10.915472984314 seconds
PHP unserialized in 7.6223039627075 seconds
Unserialize: unserialize() was roughly 43.20% faster than json_decode() 

Donc, json semble être plus rapide pour l’encodage mais lent pour le décodage. Cela pourrait donc dépendre de votre candidature et de ce que vous espérez faire le plus.

11
Jeff Whiting

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ù une "énorme" table doit être interrogée presque chaque fois que je parle à la base de données (ne demandez pas pourquoi, mais 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 requêtes. Je me suis donc intéressé aux systèmes de mise en cache php. 

J'ai essayé apcu mais cela ne répondait pas aux besoins, la mémoire n'est pas assez fiable dans ce cas. La prochaine étape consistait à mettre en cache un fichier avec une sérialisation.

La table 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, l'inconvénient majeur de json_encode/json_decode est qu'il transforme tout en une instance (ou un objet) StdClass. Si vous avez besoin de le boucler, vous le ferez probablement en le transformant en tableau, 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.8MB

C'est mieux, mais nécessite une nouvelle extension; compiler des gens parfois effrayés ...

IgBinary

@GingerDog mentionne 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 de 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.9MB

De meilleures performances que JSON, plus le tableau est grand, plus le json_decode est lent, mais vous le savez déjà.

Ces extensions externes réduisent la taille du fichier et semblent excellentes sur 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 qu'avec une fonction standard PHP? 

Nous pouvons également en déduire que, selon vos besoins, vous choisirez autre chose que quelqu'un d'autre: 

  • IgBinary est vraiment gentil 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 les normes.

Voilà, une autre comparaison des méthodes de sérialisation pour vous aider à choisir celle qui vous convient!

* Testé avec PHPUnit 3.7.31, php 5.5.10 - décodage uniquement avec un disque dur standard et un ancien processeur dual core - nombre moyen sur 10 tests de cas d'utilisation identiques, vos statistiques peuvent être différentes

8
soyuka

On dirait que la sérialisation est celle que je vais utiliser pour 2 raisons:

  • Quelqu'un a fait remarquer que la désérialisation est plus rapide que json_decode et qu'un cas 'en lecture' semble plus probable qu'un cas en 'écriture'.

  • J'ai eu des problèmes avec json_encode lorsque j'ai des chaînes avec des caractères UTF-8 non valides. Lorsque cela se produit, la chaîne finit par être vide, ce qui entraîne une perte d'informations.

8
urraka

J'ai testé cela de manière très approfondie sur un multi-hash relativement complexe et moyennement imbriqué, contenant toutes sortes de données (chaîne, NULL, entiers), et serialize/unserialize s'est avéré beaucoup plus rapide que json_encode/json_decode.

Le seul avantage que json avait dans mes tests était 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 elles révéleraient des informations que je ne peux pas laisser sortir dans la nature.

JSON encoded in 2.23700618744 seconds
PHP serialized in 1.3434419632 seconds
JSON decoded in 4.0405561924 seconds
PHP unserialized in 1.39393305779 seconds

serialized size : 14549
json_encode size : 11520
serialize() was roughly 66.51% faster than json_encode()
unserialize() was roughly 189.87% faster than json_decode()
json_encode() string was roughly 26.29% smaller than serialize()

//  Time json encoding
$start = microtime( true );
for($i = 0; $i < 10000; $i++) {
    json_encode( $test );
}
$jsonTime = microtime( true ) - $start;
echo "JSON encoded in $jsonTime seconds<br>";

//  Time serialization
$start = microtime( true );
for($i = 0; $i < 10000; $i++) {
    serialize( $test );
}
$serializeTime = microtime( true ) - $start;
echo "PHP serialized in $serializeTime seconds<br>";

//  Time json decoding
$test2 = json_encode( $test );
$start = microtime( true );
for($i = 0; $i < 10000; $i++) {
    json_decode( $test2 );
}
$jsonDecodeTime = microtime( true ) - $start;
echo "JSON decoded in $jsonDecodeTime seconds<br>";

//  Time deserialization
$test2 = serialize( $test );
$start = microtime( true );
for($i = 0; $i < 10000; $i++) {
    unserialize( $test2 );
}
$unserializeTime = microtime( true ) - $start;
echo "PHP unserialized in $unserializeTime seconds<br>";

$jsonSize = strlen(json_encode( $test ));
$phpSize = strlen(serialize( $test ));

echo "<p>serialized size : " . strlen(serialize( $test )) . "<br>";
echo "json_encode size : " . strlen(json_encode( $test )) . "<br></p>";

//  Compare them
if ( $jsonTime < $serializeTime )
{
    echo "json_encode() was roughly " . number_format( ($serializeTime / $jsonTime - 1 ) * 100, 2 ) . "% faster than serialize()";
}
else if ( $serializeTime < $jsonTime )
{
    echo "serialize() was roughly " . number_format( ($jsonTime / $serializeTime - 1 ) * 100, 2 ) . "% faster than json_encode()";
} else {
    echo 'Unpossible!';
}
    echo '<BR>';

//  Compare them
if ( $jsonDecodeTime < $unserializeTime )
{
    echo "json_decode() was roughly " . number_format( ($unserializeTime / $jsonDecodeTime - 1 ) * 100, 2 ) . "% faster than unserialize()";
}
else if ( $unserializeTime < $jsonDecodeTime )
{
    echo "unserialize() was roughly " . number_format( ($jsonDecodeTime / $unserializeTime - 1 ) * 100, 2 ) . "% faster than json_decode()";
} else {
    echo 'Unpossible!';
}
    echo '<BR>';
//  Compare them
if ( $jsonSize < $phpSize )
{
    echo "json_encode() string was roughly " . number_format( ($phpSize / $jsonSize - 1 ) * 100, 2 ) . "% smaller than serialize()";
}
else if ( $phpSize < $jsonSize )
{
    echo "serialize() string was roughly " . number_format( ($jsonSize / $phpSize - 1 ) * 100, 2 ) . "% smaller than json_encode()";
} else {
    echo 'Unpossible!';
}
6
Mr. Sox

J'ai aussi fait un petit repère. Mes résultats étaient les mêmes. Mais j'ai besoin de la performance de décodage. Là où j'ai remarqué, comme l'ont dit quelques personnes ci-dessus, unserialize est plus rapide que json_decode. unserialize prend environ 60 à 70% du json_decode temps. La conclusion est donc assez simple: Lorsque vous avez besoin de performances en codage, utilisez json_encode, lorsque vous avez besoin de performances lors du décodage, utilisez unserialize. Parce que vous ne pouvez pas fusionner les deux fonctions, vous devez faire un choix là où vous avez besoin de plus de performances.

Mon repère en pseudo:

  • Définir le tableau $ arr avec quelques clés et valeurs aléatoires
  • pour x <100; x ++; serialize et json_encode un tableau_Rand de $ arr
  • pour y <1000; y ++; json_decode la chaîne encodée en json - calc time
  • pour y <1000; y ++; désérialiser la chaîne sérialisée - temps de calcul
  • faire écho au résultat qui était plus rapide

En moyenne: unserialize a gagné 96 fois plus de 4 fois le json_decode. Avec une moyenne d'environ 1,5 ms sur 2,5 ms.

5
Jelmer

Avant de prendre votre décision finale, sachez que le format JSON n’est pas sécurisé pour les tableaux associatifs. json_decode() les renverra sous forme d’objets:

$config = array(
    'Frodo'   => 'hobbit',
    'Gimli'   => 'dwarf',
    'Gandalf' => 'wizard',
    );
print_r($config);
print_r(json_decode(json_encode($config)));

La sortie est:

Array
(
    [Frodo] => hobbit
    [Gimli] => dwarf
    [Gandalf] => wizard
)
stdClass Object
(
    [Frodo] => hobbit
    [Gimli] => dwarf
    [Gandalf] => wizard
)
2
too much php

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 jeter un œil à messagepack

1
Hutch

Tout d’abord, j’ai modifié le script pour faire un peu plus de benchmarking (et faire aussi 1000 analyses au lieu de 1 seulement):

<?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);

$totalJsonTime = 0;
$totalSerializeTime = 0;
$totalJsonWins = 0;

for ($i = 0; $i < 1000; $i++) {
    // Time json encoding
    $start = microtime(true);
    $json = json_encode($testArray);
    $jsonTime = microtime(true) - $start;
    $totalJsonTime += $jsonTime;

    // Time serialization
    $start = microtime(true);
    $serial = serialize($testArray);
    $serializeTime = microtime(true) - $start;
    $totalSerializeTime += $serializeTime;

    if ($jsonTime < $serializeTime) {
        $totalJsonWins++;
    }
}

$totalSerializeWins = 1000 - $totalJsonWins;

// Compare them
if ($totalJsonTime < $totalSerializeTime) {
    printf("json_encode() (wins: $totalJsonWins) was roughly %01.2f%% faster than serialize()\n", ($totalSerializeTime / $totalJsonTime - 1) * 100);
} else {
    printf("serialize() (wins: $totalSerializeWins) was roughly %01.2f%% faster than json_encode()\n", ($totalJsonTime / $totalSerializeTime - 1) * 100);
}

$totalJsonTime = 0;
$totalJson2Time = 0;
$totalSerializeTime = 0;
$totalJsonWins = 0;

for ($i = 0; $i < 1000; $i++) {
    // Time json decoding
    $start = microtime(true);
    $orig = json_decode($json, true);
    $jsonTime = microtime(true) - $start;
    $totalJsonTime += $jsonTime;

    $start = microtime(true);
    $origObj = json_decode($json);
    $jsonTime2 = microtime(true) - $start;
    $totalJson2Time += $jsonTime2;

    // Time serialization
    $start = microtime(true);
    $unserial = unserialize($serial);
    $serializeTime = microtime(true) - $start;
    $totalSerializeTime += $serializeTime;

    if ($jsonTime < $serializeTime) {
        $totalJsonWins++;
    }
}

$totalSerializeWins = 1000 - $totalJsonWins;


// Compare them
if ($totalJsonTime < $totalSerializeTime) {
    printf("json_decode() was roughly %01.2f%% faster than unserialize()\n", ($totalSerializeTime / $totalJsonTime - 1) * 100);
} else {
    printf("unserialize() (wins: $totalSerializeWins) was roughly %01.2f%% faster than json_decode()\n", ($totalJsonTime / $totalSerializeTime - 1) * 100);
}

// Compare them
if ($totalJson2Time < $totalSerializeTime) {
    printf("json_decode() was roughly %01.2f%% faster than unserialize()\n", ($totalSerializeTime / $totalJson2Time - 1) * 100);
} else {
    printf("unserialize() (wins: $totalSerializeWins) was roughly %01.2f%% faster than array json_decode()\n", ($totalJson2Time / $totalSerializeTime - 1) * 100);
}

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';
}

J'ai utilisé cette version de PHP 7:

PHP 7.0.14 (cli) (construit le 18 janvier 2017 19:13:23) (NTS) Droits d'auteur (c) 1997-2016 Les PHP Groupe Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies avec Zend OPcache v7.0.14, Copyright (c) 1999-2016, par Zend Technologies

Et mes résultats ont été:

serialize () (victoires: 999) était environ 10,98% plus rapide que json_encode () unserialize () (victoires: 987) était environ 33,26% plus rapide que json_decode () unserialize () (victoires: 987) était environ 48,35% plus rapide que array json_decode ()

Donc clear, serialize/unserialize est la méthode most, alors que json_encode/decode est la most portable.

Si vous envisagez un scénario dans lequel vous lisez/écrivez des données sérialisées 10 fois ou plus que nécessaire pour envoyer à ou recevoir depuis un système autre que PHP, vous êtes ENCORE meilleur choix pour utiliser serialize/unserialize et le faire json_encode ou json_decode avant la sérialisation. en termes de temps.

1
Shawn Tolidano

Découvrez les résultats ici (désolé pour le hack mettant le code PHP dans la boîte de code JS):

http://jsfiddle.net/newms87/h3b0a0ha/embedded/result/

RESULTS: serialize() et unserialize() sont tous deux beaucoup plus rapides dans PHP 5.4 sur des tableaux de taille variable.

J'ai créé un script de test sur des données réelles pour comparer json_encode et serialize et json_decode et 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.

J'ai exécuté ceci sur PHP 5.4 serveur d'hébergement partagé.

Les résultats ont été très concluants: pour ces grands ensembles de données, les grands gagnants sont la sérialisation et la non-sérialisation. 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. C'était généralement 2 à 4 fois (parfois 6 ou 7 fois) aussi vite que json_decode.

Il est intéressant de noter la différence entre les résultats de @ peter-bailey.

Voici le code PHP utilisé pour générer les résultats:

<?php

ini_set('display_errors', 1);
error_reporting(E_ALL);

function _count_depth($array)
{
    $count     = 0;
    $max_depth = 0;
    foreach ($array as $a) {
        if (is_array($a)) {
            list($cnt, $depth) = _count_depth($a);
            $count += $cnt;
            $max_depth = max($max_depth, $depth);
        } else {
            $count++;
        }
    }

    return array(
        $count,
        $max_depth + 1,
    );
}

function run_test($file)
{
    $memory     = memory_get_usage();
    $test_array = unserialize(file_get_contents($file));
    $memory     = round((memory_get_usage() - $memory) / 1024, 2);

    if (empty($test_array) || !is_array($test_array)) {
        return;
    }

    list($count, $depth) = _count_depth($test_array);

    //JSON encode test
    $start            = microtime(true);
    $json_encoded     = json_encode($test_array);
    $json_encode_time = microtime(true) - $start;

    //JSON decode test
    $start = microtime(true);
    json_decode($json_encoded);
    $json_decode_time = microtime(true) - $start;

    //serialize test
    $start          = microtime(true);
    $serialized     = serialize($test_array);
    $serialize_time = microtime(true) - $start;

    //unserialize test
    $start = microtime(true);
    unserialize($serialized);
    $unserialize_time = microtime(true) - $start;

    return array(
        'Name'                   => basename($file),
        'json_encode() Time (s)' => $json_encode_time,
        'json_decode() Time (s)' => $json_decode_time,
        'serialize() Time (s)'   => $serialize_time,
        'unserialize() Time (s)' => $unserialize_time,
        'Elements'               => $count,
        'Memory (KB)'            => $memory,
        'Max Depth'              => $depth,
        'json_encode() Win'      => ($json_encode_time > 0 && $json_encode_time < $serialize_time) ? number_format(($serialize_time / $json_encode_time - 1) * 100, 2) : '',
        'serialize() Win'        => ($serialize_time > 0 && $serialize_time < $json_encode_time) ? number_format(($json_encode_time / $serialize_time - 1) * 100, 2) : '',
        'json_decode() Win'      => ($json_decode_time > 0 && $json_decode_time < $serialize_time) ? number_format(($serialize_time / $json_decode_time - 1) * 100, 2) : '',
        'unserialize() Win'      => ($unserialize_time > 0 && $unserialize_time < $json_decode_time) ? number_format(($json_decode_time / $unserialize_time - 1) * 100, 2) : '',
    );
}

$files = glob(dirname(__FILE__) . '/system/cache/*');

$data = array();

foreach ($files as $file) {
    if (is_file($file)) {
        $result = run_test($file);

        if ($result) {
            $data[] = $result;
        }
    }
}

uasort($data, function ($a, $b) {
    return $a['Memory (KB)'] < $b['Memory (KB)'];
});

$fields = array_keys($data[0]);
?>

<table>
    <thead>
    <tr>
        <?php foreach ($fields as $f) { ?>
            <td style="text-align: center; border:1px solid black;padding: 4px 8px;font-weight:bold;font-size:1.1em"><?= $f; ?></td>
        <?php } ?>
    </tr>
    </thead>

    <tbody>
    <?php foreach ($data as $d) { ?>
        <tr>
            <?php foreach ($d as $key => $value) { ?>
                <?php $is_win = strpos($key, 'Win'); ?>
                <?php $color = ($is_win && $value) ? 'color: green;font-weight:bold;' : ''; ?>
                <td style="text-align: center; vertical-align: middle; padding: 3px 6px; border: 1px solid gray; <?= $color; ?>"><?= $value . (($is_win && $value) ? '%' : ''); ?></td>
            <?php } ?>
        </tr>
    <?php } ?>
    </tbody>
</table>
1
newms87

THX - pour ce code de référence:

Mes résultats sur le tableau que j’utilise pour la configuration sont les suivants: JSON encodé en 0.0031511783599854 secondes
PHP sérialisé en 0.0037961006164551 secondes
json_encode() était environ 20,47% plus rapide que serialize() JSON codé en 0.0070841312408447 secondes
PHP sérialisé en 0.0035839080810547 secondes
unserialize() était environ 97,66% plus rapide que json_encode()

Alors, testez-le sur vos propres données.

0
mk182

Je vous suggère d'utiliser Super Cache, qui est un mécanisme de cache de fichier qui n'utilise pas json_encode ni serialize. 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: 

<?php
require __DIR__.'/vendor/autoload.php';
use SuperCache\SuperCache as sCache;

//Saving cache value with a key
// sCache::cache('<key>')->set('<value>');
sCache::cache('myKey')->set('Key_value');

//Retrieving cache value with a key
echo sCache::cache('myKey')->get();
?>
0
shabeer

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 serialize 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 réencodage de charachter, car sérialiser stocke la longueur des chaînes et dans le format Unicode. > Le transcodage UTF-8 de quelques caractères sur un octet peut devenir long de 2 octets, ce qui provoque le blocage de l'algorithme.

0
Informate.it

Si pour résumer ce que les gens disent ici, json_decode/encode semble plus rapide que serialize/unserialize BUT Si vous effectuez var_dump, le type de l'objet sérialisé est modifié . Si, pour une raison quelconque, vous souhaitez conserver le type, avec sérialiser!

(essayez par exemple stdClass vs array)

sérialiser/désérialiser:

Array cache:
array (size=2)
  'a' => string '1' (length=1)
  'b' => int 2
Object cache:
object(stdClass)[8]
  public 'field1' => int 123
This cache:
object(Controller\Test)[8]
  protected 'view' => 

json encoder/décoder

Array cache:
object(stdClass)[7]
  public 'a' => string '1' (length=1)
  public 'b' => int 2
Object cache:
object(stdClass)[8]
  public 'field1' => int 123
This cache:
object(stdClass)[8]

Comme vous pouvez le voir, json_encode/decode convertit le tout en stdClass, ce qui n’est pas si bon, les informations sur les objets sont perdues ... Alors décidez-vous en fonction des besoins, surtout s’il ne s’agit pas uniquement de tableaux ...

0
David Constantine