2014-01-05 30 views
1

在Protobuffers文檔基本數值數據類型的有效編碼,它已被賦予在protobuffers

"For historical reasons, repeated fields of basic numeric types aren't encoded as 

efficiently as they could be. New code should use the special option [packed=true] to get 

a more efficient encoding. For example: 

repeated int32 samples = 4 [packed=true];" 

有人能解釋清楚如何語句「包裝=真正的」改進編碼的基本數值數據類型的高效化?

回答

1

基本上,在原始編碼下,對於每個元素都會出現字段標題(它由與字段編號,位移和or'd組合的導線類型組成)。因爲頭部是varint編碼的,所以每個元素至少有一個字節,但可能更多。所以10個4字節的浮點數將至少爲50個字節,而如果頭部需要5個字節(大字段數比小字段數佔用更多空間),則可能有90個字節。

使用壓縮編碼,字段標題只出現一次,然後是一個varint,指示要跟隨的字節數。因此,對於10個浮點數,有效載荷長度爲40,這是長度前綴的單個字節varint編碼。在反序列化時,它只消耗那麼多字節,像這樣讀取元素。因此,對於相同的數據(先前爲50到90個字節),我們現在使用42到46個字節(同樣,對於每個需要1到5個字節的字段範圍)。

這兩種佈局在電線上有很大的不同,並且代碼期望一個通常不能解碼另一個。因此,需要明確啓用它以防止破壞現有消息。

+0

這確實說明!!謝謝你.. –

+0

另外我只是想是否有任何類似的優化技術可用於包含大量對象的重複字段? –

+1

@aarish不,只是簡單的值 –