mardi 9 février 2010

PHP serialize() et json_encode

En réponse à Julien sur twitter.
Voici un comparatif rapide des fonctions PHP5 permettant de coder un objet en phrase. Cette pratique est utile lorsque l'on souhaite conserver une structure longue à initialiser pour la recharger ensuite très rapidement.

J'ai utilisé en source un tableau unidimensionnel provenant du logiciel MediaWiki. Il s'agit d'une liste de références à des messages en anglais et traduits en français. Le fichier est codé en UTF-8.

Le script sous PHP 5.2.11:


<?php
# Load a one dimension array named $messages
include "mediawiki/languages/messages/MessagesFr.php";

function code_time_for( $function, $on, $iter ) {
    $start = microtime(true);
    for( $i=0;$i<$iter;$i++) {
        call_user_func( $function, $on );
    }
    $end = microtime(true);
    return
        sprintf("Ran $iter x %-11s in: %9.3f ms", $function, 1000*($end - $start));
}

$msg_ser  = serialize( $messages );
$msg_json = serialize( $messages );
$times = 777;

# Lets have a look at encoding:
print code_time_for( 'serialize'  , $messages, $times ) . "\n";
print code_time_for( 'json_encode', $messages, $times ) . "\n";
# And then compare decoding functions:
print code_time_for( 'unserialize', $msg_ser , $times ) . "\n";
print code_time_for( 'json_decode', $msg_json, $times ) . "\n";


Le résultat avec 777 occurrences :

Ran 777 x serialize   in:  1211.259 ms
Ran 777 x json_encode in:  3897.529 ms
Ran 777 x unserialize in:  1359.995 ms
Ran 777 x json_decode in:  1888.151 ms


Les fonctions PHP restent plus performantes. En tout cas pour ce tableau.

1 commentaire:

Ysbaddaden a dit…

PHP serialize() est vraiment plus lent que json_encode() en PHP 5.3 (au moins sur ce cas là : hashs imbriqués de strings & integers.

Cf. http://gist.github.com/300366