ホームページ  >  記事  >  Java  >  C でプロトコル バッファー区切り I/O を実装する方法: 欠落している機能と最適化の可能性

C でプロトコル バッファー区切り I/O を実装する方法: 欠落している機能と最適化の可能性

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-03 06:44:30497ブラウズ

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

Java のプロトコル バッファー区切り I/O 関数に相当する C

プロトコル バッファーでは、メッセージの前に長さのプレフィックスを追加することが、読み取りおよびファイルから複数のメッセージを書き込む。 Java にはこの目的のための「区切り付き」I/O 関数 (parseDelimitedFrom、mergeDelimitedFrom、writeDelimitedTo など) がありますが、C には同等の関数がありません。

Google の推奨

Google の推奨C でメッセージに長さのプレフィックスを手動で付加します。これには次のことが含まれます。

  • メッセージ サイズを Variant として書き込む
  • メッセージをバッファにシリアル化する

ただし、このアプローチには最適化が欠けており、次の場合に失敗する可能性があります。

最適化された C 実装

その後、最適化された C 実装が開発され、元 Google protobuf ライブラリ作者によって共有されました。これらの実装には次のものが含まれます。

  • Varint としてサイズを書き込む
  • 効率的なシリアル化のための GetDirectBufferForNBytesAndAdvance メソッドの使用
  • メッセージごとのサイズ制限 64MB の強制

実装の詳細

writeDelimitedTo 関数は、メッセージごとに新しい CodedOutputStream を作成し、SerializeWithCachedSizes メソッドを使用してシリアル化します。メッセージが 1 つのバッファーに収まる場合は、高速な SerializeWithCachedSizesToArray メソッドが使用されます。

readDelimitedFrom 関数は、新しい CodedInputStream を作成し、PushLimit メソッドを使用してメッセージごとのサイズ制限を課します。次に、MergeFromCodedStream メソッドを使用してメッセージを解析し、メッセージ全体が消費されたことを確認します。

可用性

これらの最適化された C 実装は、公式の protobuf ライブラリの一部ではありません。ただし、これらはさまざまなサードパーティ リポジトリで見つけることも、提供されたコード スニペットを使用して手動で実装することもできます。

以上がC でプロトコル バッファー区切り I/O を実装する方法: 欠落している機能と最適化の可能性の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。