ProtoBuf和JSON性能對比


轉載自:https://blog.csdn.net/xiaoxiaoyusheng2012/article/details/81102369

ProtoBuf雖然理論上效率遠超JSON,但是在具體使用時,其效率受到實現者的代碼質量影響。

轉化效率分為兩種,解碼和編碼,解碼包括解析和對象綁定,編碼包括解析和組裝。就常用的幾個實現了這兩種格式轉換的工具來說:

1. 整數或浮點數的解碼和編碼,ProtoBuf的效率遠超JSON,明顯可以發現,JSON不適合存數字,特別是DOUBLE

2. 對象解碼和編碼,在對象內都是字符串時,效率相差無幾,甚至慢與DSL-JSON。ProtoBuf使用數字tab代替字符串格式的字段名進行內容的分發,在字段名不長的情況下,效率相差無幾。

3. 整數或浮點數數組的編解碼,效率相差無幾。顯然ProtoBuf不擅長處理數組,數字只有放在對象里才快,當然JSON在不犧牲精度的情況下,處理DOUBLE實在是太慢了。

4. 字符串編解碼,由於String基於char[]而數據傳遞基於byte[],這個轉化過程無法省略,並且存在編碼格式的轉換。兩者效率相差不多。

 

總結:

編解碼數字的時候,JSON仍然是非常慢的。Jsoniter 把這個差距從 10 倍縮小到了 3 倍多一些(會犧牲精度做優化)。
JSON 最差的情況是下面幾種:

  • 跳過非常長的字符串:和字符串長度線性相關,因為ProtoBuf會存長度,而JSON則需要線性遍歷。
  • 解碼 double 字段:Protobuf 優勢明顯,是 Jsoniter的 3.27 倍,是 Jackson 的 13.75 倍。
  • 編碼 double 字段:如果不能接受只保留 6 位小數,Protobuf 是 Jackson 的 12.71 倍。如果接受精度損失,Protobuf 是 Jsoniter 的 1.96 倍。
  • 解碼整數:Protobuf 是 Jsoniter 的 2.64 倍,是 Jackson 的 8.51 倍。

如果你的生產環境中的JSON沒有那么多的double字段,都是字符串占大頭,那么基本上來說替換成 Protobuf 也就是僅僅比 Jsoniter 提高一點點,肯定在2倍之內。如果不幸的話,沒准 Protobuf 還要更慢一點。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM