zoukankan      html  css  js  c++  java
  • 两种数据序列化方案性能对比:Msgpack和Json

     MessagePack(简写msgpack)是一个高效的二进制序列化格式。它让你像JSON一样可以在各种语言之间交换数据。但是它比JSON更快、更小。小的整数会被编码成一个字节,短的字符串仅仅只需要比它的长度多一字节的大小。之前在lua脚本中使用过msgpack,因为有大量数据要入redis,而考虑到内存开销,使用了压缩比更大的msgpack。因为msgpack是一个二进制格式,所以没法像json后的字符串一样可直观地查看数据。
     
        msgpack的官网地址:http://pecl.php.net/package/msgpack 里面有各PHP版本windows下的dll扩展,也有源码包供linux下编译,所以像lua这样的脚本语言可以直接使用。msgpack和json_encode都是序列化存储数据,那么msgpack的效率与json的效率相比的话到底怎么样呢?看下面这个简单的对比程序:

    //msgpack与json的性能对比
    //1,数据拼凑
    $data =array(
        'youku' => '优酷视频', 'pptv' => 'PPTV', 'sohu' => '搜狐视频', 'qiyi' => '奇艺视频', 'letv' => '乐视视频',
        'tencent' => '腾讯视频', 'sina' => '新浪视频', 'tudou' => '土豆视频', 'm1905' => '电影网', 'cntv' => 'CNTV',
    );
    $data = json_encode($data);
    $newArr = array();
    for($i = 1; $i<=500; $i++)  //修改此处$i的最大值以控制数据的大小
    {
        $newArr [] =$data;
    }
    
    //数据大小对比
    $msg_data = msgpack_pack($newArr);
    echo "使用msgpack处理后大小:".strlen($msg_data);
    $json_data = json_encode($newArr);
    echo "<br>使用json处理后大小:".strlen($json_data);
    echo "<br>msgpack处理后大小与json处理后大小比为1:".round((strlen($json_data)/strlen($msg_data)),2);
    
    //计算1000次msgpack压缩用时
    $time = microtime(true);
    for($i = 1; $i<1000; $i++){
        msgpack_pack($newArr);
    }
    echo '<br>1000次msgpack操作用时:'.(microtime(true)- $time);
    
    //计算1000次json_encode压缩用时
    $time1 = microtime(true);
    for($i = 1; $i<1000; $i++){
        json_encode($newArr);
    }
    echo '<br>1000次json_encode操作用时:'.(microtime(true)- $time1);

    程序过程没什么可说的了,就是先拼凑了一个数组数据(用$i来控制它的大小)。然后对比对这个数组的处理用时,如果$i很小,假如为2,得到的结果如下:

    使用msgpack处理后大小:609
    使用json处理后大小:751
    msgpack处理后大小与json处理后大小比为1:1.23
    1000次msgpack操作用时:0.05400013923645
    1000次json_encode操作用时:0.03600001335144

    从上面的结果来看,msg_pack的效率根本不如json_encode的效率,只是msg_pack的压缩率大些而已。而当我把$i改大点,比如改到500后,结果就完全反转了:

    使用msgpack处理后大小:152003
    使用json处理后大小:187501
    msgpack处理后大小与json处理后大小比为1:1.23
    1000次msgpack操作用时:0.68599987030029
    1000次json_encode操作用时:2.2000000476837

     经过多次测试,最后做两个总结如下:   

    1,msg_pack的压缩效率比json_encode大是毫无疑问,但压缩比我这只看到提高了20%左右,可能和数据类型有关系,这个值只供参考。

    2,在数据量较小的情况下,msg_pack的效率不如json_encode.而在数据量较大时,msg_pack的效率就远大于json_encode。

    3,和数据序列化一样,对数据的反序列化上,也是数量量大时,msg_unpack的效率远大于json_decode.

    下面是进行反序列化时的结果:

    1000次msgpack操作用时:0.80399990081787
    1000次json_encode操作用时:2.6389999389648

    转载于:https://ask.zkbhj.com/?/article/258

  • 相关阅读:
    魔法跳舞链 51Nod
    反射
    JDBC---后端服务器与数据库交互的桥梁
    多线程
    IO流
    继承与重写
    java.util包
    多态
    Java.lang包
    异常
  • 原文地址:https://www.cnblogs.com/it-deepinmind/p/14243079.html
Copyright © 2011-2022 走看看