2009-05-28 10 views
1

Wenn ich ein Array von Int32 mit dem BinaryFormatter serialisieren, bekomme ich ca. 400MB/s (100 Millionen Elemente in einer Sekunde), aber wenn ich versuche, ein Array von DateTime zu serialisieren, bekomme ich nur ein Durchsatz von etwa 27 MB/s (100 Millionen Artikel in 30 Sekunden). Ein DateTime belegt acht Bytes in serialisierter Form. Ich denke, dass die BinaryFormatter die ISerializable-Schnittstelle verwendet, wenn seine implementiert, so hatte ich einen Blick auf die GetObjectData Umsetzung des Datetime-Typ:Binäre Serialisierung eines Array von 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); 
} 

Ich bin verwirrt, dass ein UInt64 und ein Int64 mit dem Ausgang hinzugefügt werden, Das sollte 16 Bytes in der Summe sein, aber das spiegelt nicht meine Maße wider. Also, wie wird DateTime wirklich zu binär serialisiert?

Antwort

0

Es klingt, als ob Sie E/A an Ihre Int-Serialisierung gebunden sind, aber Sie sind CPU-gebunden für Ihre DateTime-Serialisierung (es dauert offensichtlich viel mehr Zeit für die Serialisierung einer DateTime als für die Serialisierung eines Int). Folglich werden Ihre Messungen kein genaues Verhältnis zwischen Ihren beiden Datentypgrößen widerspiegeln.

+0

Messungen wurden durch Serialisierung zu einem MemoryStream durchgeführt, also keine I/O. – Rauhotz

+0

OK, Sie sind also nicht an E/A gebunden, aber das Serialisieren der DateTime dauert anscheinend 30x länger als Int. –

0

Es wird mehr als 16 Bytes sein, da es auch die Schlüssel speichern muss.

Sie könnten die Ticks selbst (direkt) serialisieren? Alternative; Ich habe es in diesem Szenario nicht getestet, aber Sie könnten protobuf-net einen Wirbel geben (es ist eine leistungsfähige binäre Serialisierungsmaschine).

+0

100 Millionen DateTimes gibt mir eine Streamlänge von ~ 800MB, also scheint der BinaryFormatter so etwas wie die Ticks zu speichern, aber leider ziemlich langsam. – Rauhotz

+0

Interessant; es muss besondere Handhabung haben ... neugierig, dass es so langsam ist .. –

Verwandte Themen