受欢迎的博客标签

最近弄 Redis ,涉及数据序列化存储的问题,对比了:JSON, Serialize, Msgpack, Hprose 四种方式 1. 对序列化后的字符串长度对比:测试代码: $arr = [0, 1, 2, 'a', 'b', 'c', 'd', 'a'=>'12', '包含中文', 'abcd包含中文efg'=>'abc一二三四defg', '键名'=>['abc'=>['def'=>123, 456, 'abcd中文内容efg'], 'a之间c'=>['a'=>123, 'c', 5=>6]]];$str = hprose_serialize($arr);echo 'Hprose: ';echo '<br>';echo '长度: '. strlen($str);echo '<br>';echo '内容:'. $str;echo '<hr>';$str = msgpack_pack($arr);echo 'Msgpack: ';echo '<br>';echo '长度: '. strlen($str);echo '<br>';echo '内容:'. $str;echo '<hr>';$str = json_encode($arr);echo 'JSON: ';echo '<br>';echo '长度: '. strlen($str);echo '<br>';echo '内容:'. $str;echo '<hr>';$str = serialize($arr);echo 'Serialize: ';echo '<br>';echo '长度: '. strlen($str);echo '<br>';echo '内容:'. $str;echo '<hr>';结果: Hprose: 长度: 196 内容:m11{0011223ua4ub5uc6uds1”a”s2”12”7s4”包含中文”s11”abcd包含中文efg”s11”abc一二三四defg”s2”键名”m2{s3”abc”m3{s3”def”i123;0i456;1s11”abcd中文内容efg”}s4”a之间c”m3{r1;i123;0uc56}}} Msgpack: 长度: 139 内容:��a�b�c�d�a�12�包含中文�abcd包含中文efg�abc一二三四defg�键名��abc��def{���abcd中文内容efg�a之间c��a{�c JSON: 长度: 281 内容: {“0”:0,”1”:1,”2”:2,”3”:”a”,”4”:”b”,”5”:”c”,”6”:”d”,”a”:”12”,”7”:”\u5305\u542b\u4e2d\u6587”,”abcd\u5305\u542b\u4e2d\u6587efg”:”abc\u4e00\u4e8c\u4e09\u56dbdefg”,”\u952e\u540d”:{“abc”:{“def”:123,”0”:456,”1”:”abcd\u4e2d\u6587\u5185\u5bb9efg”},”a\u4e4b\u95f4c”:{“a”:123,”0”:”c”,”5”:6}}} Serialize: 长度: 321 内容:a:11:{i:0;i:0;i:1;i:1;i:2;i:2;i:3;s:1:”a”;i:4;s:1:”b”;i:5;s:1:”c”;i:6;s:1:”d”;s:1:”a”;s:2:”12”;i:7;s:12:”包含中文”;s:19:”abcd包含中文efg”;s:19:”abc一二三四defg”;s:6:”键名”;a:2:{s:3:”abc”;a:3:{s:3:”def”;i:123;i:0;i:456;i:1;s:19:”abcd中文内容efg”;}s:8:”a之间c”;a:3:{s:1:”a”;i:123;i:0;s:1:”c”;i:5;i:6;}}} 对比结论: 一般情况下,Msgpack < JSON < Serialize 。差距一般在 1~3倍左右,Msgpack 体积非常小 2. 序列化速度对比:测试代码: echo 'Begin ~~<br><hr><br>';$begin = microtime(true);$bm = memory_get_usage(); for ($i = 0; $i <= 100000; $i++) {// $str = hprose_serialize($arr);// $str = msgpack_pack($arr);// $str = serialize($arr); $str = json_encode($arr);}   $em = memory_get_usage(); echo 'End !<br><hr><br>Use Time :';echo microtime(true) - $begin;echo '<br><hr><br>Use Mem:';echo ceil(($em - $bm)/1024/1024) .'MB';测试结果: Hprose 耗时: 0.435 ~ 0.466 Msgpack 耗时: 0.328 ~ 0.378 Serialize 耗时: 0.496 ~ 0.541 JSON 耗时: 0.431 ~ 0.469 3. 反序列化速度对比测试代码: echo 'Begin ~~<br><hr><br>';$begin = microtime(true);$bm = memory_get_usage(); //$str = hprose_serialize($arr);//$str = msgpack_pack($arr);//$str = serialize($arr);$str = json_encode($arr);for ($i = 0; $i <= 100000; $i++) {// hprose_unserialize($str);// msgpack_unpack($str);// unserialize($str); json_decode($str);}   $em = memory_get_usage(); echo 'End !<br><hr><br>Use Time :';echo microtime(true) - $begin;echo '<br><hr><br>Use Mem:';echo ceil(($em - $bm)/1024/1024) .'MB';测试结果: Hprose 耗时: 0.553 ~ 0.591 Msgpack 耗时: 0.492 ~ 0.550 Serialize 耗时: 0.496 ~ 0.531 JSON 耗时: 0.852 ~ 0.893 4. Redis 测试:每次测试清空后添加 两百万 条进队列,查看 Reids info 中 Memory 信息: a. 初始化空数据时: 这里写图片描述 b. 使用 Msgpack 序列化后录入 Msgpack 序列化内存占用 c. 使用 JSON 编码后录入 JSON 序列化内存占用 d. 使用 Serialize 序列化后录入 Serialize 序列化内存占用 对比结果: Msgpack 占用内存 385M JSON 占用内存 660M Serialize 占用内存 752M Hprose 我没测试,体积应该在 Msgpack 和 JSON 之间 总结:速度: Msgpack 速度最快,其次 Serialize, JSON 反序列化速度慢了近一倍 体积: Msgpack 最小,其次 JSON,Serialize 体积最大,一般比 Msgpack 大 1~3 倍。 推荐使用 Msgpack 进行序列化 感觉从各方面来看 Msgpack 都是非常牛逼的,只不过需要自己单独安装 Msgpack 的扩展,不过安装也很简单的。 服务器上可以直接 pecl install msgpack 如果不行的话,就手动下载 tgz 包: 在这里下载最新版本 https://pecl.php.net/package/msgpack 然后 pecl install msgpack-0.5.6.tgz 即可 之前用 Hprose 时据说他的 PHP Pecl 扩展 hprose_serialize 比 Msgpack 还要快,但今天测试发现比 Msgpack 还要慢一点点,体积也要大一些,不过相对于 PHP 的 serialize 来还是要好一些吧。 测试平台说明:windows7 x64 I7 4核8线程 内存16G PHP5.5.19 Redis 2.8.21   二、 SerializersCompare Showcasing a few C# text and binary serializers for performance and size. Similar in concept (but not internal design) to https://github.com/eishay/jvm-serializers/wiki but for C# instead of Java. Feel free to improve and send your pull request to me. Results 1000 iterations per serializer, average times listed Sorting result by size Name Bytes Time (ms) ------------------------------------ Avro (cheating) 133 0.0142 Avro 133 0.0568 Avro MSFT 141 0.0051 Thrift (cheating) 148 0.0069 Thrift 148 0.1470 ProtoBuf 155 0.0077 MessagePack 230 0.0296 ServiceStackJSV 258 0.0159 Json.NET BSON 286 0.0381 ServiceStackJson 290 0.0164 Json.NET 290 0.0333 XmlSerializer 571 0.1025 Binary Formatter 748 0.0344.