2009-11-12 6 views
33

the protocol buffers solution for .NETMarc Gravellによって開発された理由はわかりますか?protobuf-netはどのように優れたパフォーマンスを達成しますか?

私は、元のGoogleソリューションがそのパフォーマンスをどのように達成したかを理解できます。オブジェクトの直列化のために最適化されたコードをあらかじめ生成しています。私は手作業でいくつかのシリアライゼーションを書いており、リフレクションを避ければこのようにかなり高速なコードを書くことが可能であることを知っています。しかし、Marcのライブラリは、属性を使用し、生成されたコードを生成しないランタイムソリューションです。それでどうやって動くの?

+4

あなたがソースを読んでみましたか?あるいはMarkに直接お尋ねしますか? – Lazarus

+0

私はいくつかのアイデアを試してみましたが、もし速い答えが得られれば素敵です。 – MichaelT

+2

これは何時間も話しています.-pしかし仕事が終わるまで待つ必要があります... –

答えて

41

protobuf-netは戦略パターンを使用します。 (型ごとに1回だけ)必要に応じて型を調べるためにリフレクションを使用し、シリアライザのセットを構築します(共通のインターフェイスに基づいています)。使用時に既知のシリアライザのセット

の中には、それがメンバーと話すときに反射の合理的な使用を試みます。プロパティと対話するにはDelegate.CreateDelegate、フィールドに対話するにはDynamicMethod(およびカスタムIL)を使用します(可能な場合は、ターゲットフレームワークによって異なります)。これは、ちょうどDynamicInvoke(これは非常に遅い)ではなく、と知られているデリゲートタイプと常に話していることを意味します。固定サイズを使用して、(入力/出力ストリームの)

    • ローカルbyte[]緩衝:

      狂いがないと、コードは換算で(おそらく読みやすさを犠牲にして)、いくつかの最適化を持っています配列(リストなどではなく)。おそらく、二値化処理を中心に

    • 多数の微調整/ twiddlesの/ etcボクシングを避けるために、ジェネリックを使用して
    • すぎは後知恵では

    をループし、私はジェネリックポイントでミスをしたと思います。その複雑さは、ジェネリックをシステムbent it out of shape in a few placesに強制し、(複雑なモデルの場合)いくつかの重大な問題を積極的に引き起こすことを意味しました。on compact framework

    は、私は(唯一の私の頭の中で) -genericインターフェースを使用して、これをリファクタリングすると、代わりに(適したフレームワークのための)ILGeneratorをさらに活用するために、いくつかのデザインを持っている(私の最初の選択肢はExpressionをされて、それだろう力より高いフレームワークバージョン)。しかし問題は、これが働くにはかなりの時間がかかることであり、ごく最近まではI've been pretty swampedです。

    最近私はstart spending some time on protobuf-net againに管理していますので、うまくいけばリクエストのバックログなどをクリアしてすぐに開始してください。反射(すなわち、ワイヤマッピングを別々に記述する)よりもモデルotherで動作させることも私の意図です。


    、私はまた、あなたが生成されたコードを使用する場合は2(オプション)codegenをルートがあることを明確にすべき任意の生成されたコード

    を生成しません。 protogen.exeまたはVS add-inは、.protoファイルからのコード生成を許可します。しかし、これはが必要ではありません。 - 既存の.protoファイルがある場合、または契約書の最初の開発のために別の言語(C++など)と相互運用する意向がある場合には、主に便利です。

  • -3

    パフォーマンスは非常に良いです!

    あなたは、この比較は、大小のデータサンプルと異なるフォーマットを含んME- http://maxondev.com/serialization-performance-comparison-c-net-formats-frameworks-xmldatacontractserializer-xmlserializer-binaryformatter-json-newtonsoft-servicestack-text/

    によって行わいるProtobufなど、異なるフォーマット間の包括的な比較を見ることができます。私の後でのテストの

    一つは enter image description here

    +0

    質問はどのようにパフォーマンスが達成されたかについてのものであり、どのようにパフォーマンスが良いかに関するものではありませんでした。 –

    関連する問題