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