2009-05-28 11 views
1

BinaryFormatterを使用してInt32の配列をシリアル化すると、約400MB /秒(1秒で1億のアイテム)が得られますが、DateTimeの配列をシリアル化しようとすると、スループットは約27MB/s(30秒で1億項目)。 1つのDateTimeはシリアル化された形式で8バイトを占有します。私はそのが実施された場合にBinaryFormatterは、ISerializableインターフェイスを使用していることを推測するので、私はのDateTime型のGetObjectDataの実装を見ていた:DateTimeの配列のバイナリシリアル化

void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) 
{ 
    if (info == null) 
    { 
     throw new ArgumentNullException("info"); 
    } 
    info.AddValue("ticks", this.InternalTicks); 
    info.AddValue("dateData", this.dateData); 
} 

私はUInt64型とInt64のは、出力に追加されていることを混乱しています、これは合計で16バイトでなければならないが、それは私の尺度を反映していない。ですから、DateTimeは実際にバイナリにシリアル化されていますか?

答えて

0

intシリアル化でI/Oバインドされているように聞こえますが、DateTimeシリアル化にCPUバインドされています(intをシリアル化するよりも、DateTimeのシリアル化にはCPU時間がかかります)。したがって、測定値には2つのデータ型サイズの正確な比は反映されません。

+0

対策はMemoryStreamにシリアル化することで行われ、I/Oは行われません。 – Rauhotz

+0

OK、I/Oバインディングではないですが、DateTimeのシリアル化は明らかにintより30倍長くなります。 –

0

キーを格納する必要があるため、16バイト以上になります。

自分でティックをシリアル化できますか(直接)?あるいは、私はこのシナリオでそれをテストしていませんが、protobuf-netにwhirl(高性能バイナリ直列化エンジン)を与えるかもしれません。

+0

1億回のDateTimesは私に〜800MBのストリーム長を与えるので、BinaryFormatterはダニのようなものを保存するようですが、残念なことに、かなり遅いです。興味深い; – Rauhotz

+0

;それは特別な扱いをしなければならない...それは非常に遅い興味がある.. –

関連する問題