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
