2014-09-05 46 views
1

我的結構包含重複的字段是自身結構小,只包含兩個整數:在Google Protocol Buffers中是否需要字段更有效地編碼?

message Bin { 
    optional int32 slot = 1; 
    optional int32 count = 2; 
    } 

    message Histogram { 
    repeated Bin bin = 1; // Might be about 200 - 400 bins. 
    } 

請問Bin得到更有效的,如果我定義slotcountrequired,而不是編碼?

我認爲,在不太可能的變化情況下,我可以完全重新定義Bin消息,並修改Histogram作爲

repeated Bin2 bin2 = 2; 

repeated字段可以被丟棄)

+0

否,每個字段之前還有一個Field_Number/Field_Type字段後跟數據 – 2014-09-05 06:30:58

回答

1

沒有,基本上; encoding details are here,但是不管是optional還是requiredslot/count將會是一個varint field-header/wire-type組合,接着是varint值。 optional vs required不改變格式:它只是改變是否需要該值。有趣的是,在repeated值與恰好一個值之間實際上沒有差異,而當前值是optional/required確實更改的唯一時間是對重複原語的「打包」編碼。如果你有他們很多,你實際上可以從1個或2堆積陣列,而不是獲得更高效的數據:

message Histogram { 
    repeated int32 slots = 1 [packed=true]; 
    repeated int32 counts = 2 [packed=true]; 
} 

以上是少方便,但更高效線。當然,你可以做同樣的事情與單個雙倍長度數組:

message Histogram { 
    repeated int32 slotsAndCounts = 1 [packed=true]; 
} 

含有5項甲正常重複場工作原理:

  • 字段標題,值,字段頭,值,報頭字段,值,字段頭,值,字段頭,值

擠得含有5項重複場工作原理:

  • 字段標題,長度,值,值,值,值,值
相關問題