注册 登陆

    2021-03-18 19:43:20JSON和serialize和igbinary和msgpack区别

    您现在的位置是: 首页 >  php >  JSON和serialize和igbinary和msgpack区别

    JSON

    即JavaScript Object Notation,是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C、C++、C#、Java、JavaScript、Perl、Python等)。这些特性使JSON成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成(网络传输速率)。

    serialize
    它是php的一个方法,将变量序列化,返回一个具有变量类型和结构的字符串表达式。

    igbinary
    php序列化的一个代替方案,并未加入到php的标准库中。该序列话主要是对时间和空间消耗的文字表述,igbinary提供结构紧凑二进制形式。

    msgpack
    全程MessagePack,是一个基于二进制高效的对象序列化类库,可用于跨语言通信,它可以像JSON那样,在许多种语言之间交换结构对象,支持Python、Ruby、Java、C/C++等众多语言。


    由于igbinary和msgpack不是php自带的,因此我们需要先进行安装。安装步骤略。


    简单运行

    为了便于了解它们的数据结构,编写测试代码,输出格式化后的数据。

    <?php
    $data = array( 'name' => 'Shy Song',
    'age' => 25,
    'country' => 'China'
    );
    $json_data = json_encode($data);
    $serialize_data = serialize($data);
    $igbinary_data = igbinary_serialize($data);
    $msgpack_data = msgpack_pack($data);
    print 'JSON: ' . $json_data;
    print 'length: ' . strlen($json_data);
    print 'serialize: ' . $serialize_data;
    print 'length: ' . strlen($serialize_data);
    print 'igbinary: ' . $igbinary_data;
    print 'length: ' . strlen($igbinary_data);
    print 'msgpack: ' . $msgpack_data;
    print 'length: ' . strlen($msgpack_data);

    输出结果如下:

    JSON:
    {"name":"Shy","age":25,"country":"China"}
    length: 41
    serialize:
    a:3:{s:4:"name";s:3:"Shy";s:3:"age";i:25;s:7:"country";s:5:"China";}
    length: 68
    igbinary:
    nameShyagecountryChina;
    length: 40
    msgpack:
    ��name�Shy�age�country�China
    length: 29

    可以看出,msgpack最短但不可读,serialize最长,json和igbinary长度差不多。注意,igbinary的实际数据比输出结果要长,只是不可显示。


    性能对比

    编写代码,对比不同数据转换所耗费的时间。
    <?php
    $info = array( 'name' => 'Shy',
    'age' => 25,
    'country' => 'China'
    );
    $data = array();
    for($i = 0; $i < 1000; $i++)
    {
    $data[$i] = $info;
    }
    $time_start = microtime(true);
    for($i = 0; $i < 10000; $i++)
    {
    $json_data = json_encode($data);
    #$serialize_data = serialize($data);
    #$igbinary_data = igbinary_serialize($data);
    #$msgpack_data = msgpack_pack($data);
    }
    $time_end = microtime(true);
    echo round($time_end - $time_start, 3);

    得到的结果是,JSON 7.232秒,serialize 11.887秒,igbinary 1.156秒,msgpack 1.148秒。

    通过以上对比,我们可以看到性能方面igbinary和msgpack远远优于JSON和serialize,且当面对深度的多维数组时,json和serialize的性能会大幅度下降。

    总结

    1. JSON是最为常用的、跨语言的数据传输方案,数据转换灵活,转换后的格式依旧保持清晰、可读,适用于通常情况下的数据传输。
    2. serialize常用于方法、类的序列化,适用于在不同程序间进行函数的传输。
    3. msgpack比JSON更快速也更轻巧,压缩后的数据格式会比json小,但是其可读性低,适用于对传输性能要求高且不关心数据格式的场景使用。比如配合gzcompress压缩函数,做商品的库存序列化数据缓存
    4. igbinary为结构化数据,速度快,内存占用低,适用于memcached、redis等类似的基于内存的储量序列化的数据。

关键字词: JSON和serialize和igbinary和msgpack区别

0