2012-02-15 3 views
1

プロパティとフィールドが構成されている生のメモリチャンクとしてデータをシリアル化することができた場合、これらのオブジェクトを別のシステムに伝達する方がずっと速いはずです。システムは、このメモリのためにメモリを割り当て、参照先ポインタを適切に設定するだけでよい。オブジェクトをrawメモリとしてシリアル化する

はい、私はそれが少し単純すぎることを知っていますし、おそらく循環参照のようにするのは難しい理由が多すぎます。しかし、誰かがそれを試したことがあるのか​​、ある制限を満たしているオブジェクトでそれをやり遂げる方法があるのだろうかと思っています。

これは一方で、おそらく私はマイクロ最適化しようとしていますが、実際には、パフォーマンスが重要な特定のシナリオでは非常に有用なようです。

+0

あなたのようなメモリマップされたネットワーク通信は、実際にはかなり一般的な場所だと思います。すべてのマシンが同じハードウェアと同じバイナリを持っているなら、それはかなり実現可能です。 –

+0

@KerrekSBそれは特別なハードウェアを必要とするものであり、さらなる読書のための推奨事項はありますか? –

答えて

1

明らかに、この種のシリアライゼーションはいつでもJSONよりも速くなるはずです(XMLは定義によって遅いですが、実際にはLが意味するものだと思いますがXMSだと思っていましたが、 Sを逃してLで終わった)。しかし、実世界のシナリオでGoogleのプロトコルバッファなどの効率的なバイナリシリアル化を打ち負かすことはできません。

あなたのシリアル化されたエンティティが他のエンティティへの参照を保持していない場合、両側のメモリレイアウトはまったく同じです(同じ位置合わせ、同じ注文など...)。メモリバッファを1回コピーすることでパフォーマンスを向上させることができます。しかし、2番目には参照を再構築する必要があり、参照されたオブジェクトを参照するのに比べてメモリのコピーは簡単です。メモリをコピーするのは、特にであり、特にキャッシュミスを最小限に抑えるためです。

+0

したがって、パフォーマンスの向上が実用上重要でないほどに最小限に抑えられるように参照を再構成する必要がある場合、 –

+0

私は生のメモリアドレスは絶対になると思います。あなたは単純に範囲をコピーしてポインタを調整することなく(どこかが紛失していない限り)どこか別の範囲を摘出することはできません。しかし、データを共有メモリに置いておけば、複数のプロセスがそれにマップしてそれを見ることができます。私はこの「直列化」とは言っていません。 – seand

+0

はい、まさに私が言っていることです。たぶんあなたが非常に少数のエンティティで巨大な構造を持っていない限り、それは通常起こることはありません。 – zmbq

0

通常のメモリアドレスのようなものは、直列化と逆シリアル化の間で完全に壊れます。しかし、賢明で慎重であれば、データ構造がシリアライズされる仕組みをデバイス化することができます。たぶんoffsetからbytes-from-baseにアドレスを変換しますか?

+0

おそらく必要ではないシーケンシャルレイアウトの構造体の場合は、何か他のもののためにデータが全面に広がっていて、それが実用的かどうかわかりません。私は何らかのデータの塊がどのプロパティに属しているかを伝え、クライアントが新しいポインタで参照を再構築するように、何とかして考えていました。 zmbqによると、それは利点を否定するかもしれないように聞こえる。 –

関連する問題