首頁  >  文章  >  Java  >  如何在 C 中實現協議緩衝區定界 I/O:缺少的功能和潛在的最佳化

如何在 C 中實現協議緩衝區定界 I/O:缺少的功能和潛在的最佳化

Patricia Arquette
Patricia Arquette原創
2024-11-03 06:44:30436瀏覽

 How to Implement Protocol Buffers Delimited I/O in C  : Missing Functionality and Potential Optimizations

Java 中Protocol Buffers 分隔I/O 函數的C 等效項

在Protocol Buffers 中,在訊息之前加上長度前綴讀取和發送訊息至關重要從文件寫入多個訊息。雖然 Java 為此目的提供了「定界」I/O 函數(例如 parseDelimitedFrom、mergeDelimitedFrom、writeDelimitedTo),但 C 缺乏等效函數。

Google 推薦

Google 推薦在 C 中手動為訊息附加長度前綴。這涉及到:

  • 將訊息大小寫入Varint
  • 將訊息序列化到緩衝區

但是,這種方法缺乏最佳化,可能會失敗輸入大於64MB。

最佳化的 C 實作

隨後,前 Google protobuf 函式庫作者開發並共享了最佳化的 C 實作。這些實作包括:

  • 將大小寫入Varint
  • 使用GetDirectBufferForNBytesAndAdvance 方法進行高效序列化
  • 強制每個訊息的大小限制為64MB

實作細節

writeDelimitedTo 函數會為每個訊息建立一個新的CodedOutputStream 並使用SerializeWithCachedSizes 方法將其序列化。如果訊息適合一個緩衝區,則使用更快的 SerializeWithCachedSizesToArray 方法。

readDelimitedFrom 函數建立一個新的 CodedInputStream 並使用 PushLimit 方法對每個訊息施加大小限制。然後,它使用 MergeFromCodedStream 方法解析訊息並驗證整個訊息是否已被消耗。

可用性

這些最佳化的 C 實作不是官方 protobuf 函式庫的一部分。但是,它們可以在各種第三方存儲庫中找到,或者使用提供的程式碼片段手動實現。

以上是如何在 C 中實現協議緩衝區定界 I/O:缺少的功能和潛在的最佳化的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn