当前位置 博文首页 > 详解php中implode explode serialize json msgpack性能对比

    详解php中implode explode serialize json msgpack性能对比

    作者:傲雪星枫 时间:2021-09-09 19:09

    测试方法

    首先使用implode, serialize, json_encode, msgpack_pack创建四个文本文件,用于测试。

    创建代码如下:

    <?php
    $arr = array(
        'content1' => '一二三四五六七八九十',
        'content2' => '一二三四五六七八九十',
        'content3' => '一二三四五六七八九十'
    );
    echo file_put_contents('implode.txt', implode(',',$arr), true).'<br>';
    echo file_put_contents('serialize.txt', serialize($arr), true).'<br>';
    echo file_put_contents('json.txt', json_encode($arr), true).'<br>';
    echo file_put_contents('msgpack.txt', msgpack_pack($arr), true);
    ?>

    创建后生成

    implode.txt    92字节
    serialize.txt   165字节
    json.txt          223字节
    msgpack.txt  121字节

    生成的字符串大小排序如下 implode < msgpack_pack < serialize < json_encode

    如果数组简单,则json_encode有可能比serialize小

    例如:

    $arr = array('一','二','三','四','五','六','七','八','九','十');

    serialize   为147字节

    json_encode 为91字节

    比较 implode, serialize, json_encode, msgpack_pack 性能

    <?php
    $arr = array(
        'content1' => '一二三四五六七八九十',
        'content2' => '一二三四五六七八九十',
        'content3' => '一二三四五六七八九十'
    );
     
    $start = microtime(true);
    $i = 1000000;
    while($i>0){
        // 分别测试运行时间及内存使用情况
        $tmp = implode(',',$arr);
        // $tmp = serialize($arr);
        // $tmp = json_encode($arr);
        // $tmp = msgpack_pack($arr);
        $i--;
    }
    $end = microtime(true);
    echo 'run time:'.($end-$start).'s<br>';
    echo 'memory usage:'.(memory_get_usage()/1024).'KB';
    ?>

    implode       1.3225722312927s    628.50KB

    serialize     2.0553789138794s    628.32KB

    json_encode   2.5058920383453s    628.34KB

    结果:内存使用情况差不多,运行时间 implode < msgpack_pack < serialize < json_encode

    比较 explode, unserialize, json_decode, msgpack_unpack 性能

    <?php
    $data = file_get_contents('implode.txt');
    //$data = file_get_contents('serialize.txt');
    //$data = file_get_contents('json.txt');
    //$data = file_get_contents('msgpack.txt');
     
    $start = microtime(true);
    $i = 1000000;
    while($i>0){
        $tmp = explode(',',$data);
        //$tmp = unserialize($data);
        //$tmp = json_decode($data, true);
        //$tmp = msgpack_unpack($data);
        $i--;
    }
    $end = microtime(true);
    echo 'run time:'.($end-$start).'s<br>';
    echo 'memory usage:'.(memory_get_usage()/1024).'KB';
    ?>

    explode         1.7446749210358s    628.74KB

    unserialize     2.1386790275574s    628.67KB

    json_decode     5.2423169612885s    628.84KB

    结果:内存使用情况差不多,运行时间 explode < serialize < msgpack_unpack < json_decode

    总结

    由于implode/explode不适合使用复杂的结构,因此常用的为serialize,json,msgpack三种。

    而三种比较,运行速度,内存占用,空间占用最优为msgpack, 其次是serialize,最后是json。

    如有条件,建议使用msgpack序列化处理数据。

    jsjbwy
    下一篇:没有了