2009-05-28 89 views
1

當我使用BinaryFormatter對Int32數組進行序列化時,我獲得了大約400MB/s(1秒內有1億個項目),但是當我嘗試序列化一個DateTime數組時,吞吐量約爲27MB/s(30秒內1億個項目)。一個DateTime以序列化形式佔用八個字節。我猜測,BinaryFormatter的使用ISerializable接口,如果實現的,所以我不得不看看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綁定(顯然需要更多的CPU時間來序列化DateTime比序列化一個int)。因此,您的測量結果不會反映您的兩種數據類型大小之間的確切比例。

+0

測量是通過序列化到MemoryStream來完成的,所以沒有I/O。 – Rauhotz 2009-05-28 22:04:18

+0

好的,所以你不是I/O綁定的,但是序列化DateTime顯然比int要長30倍。 – 2009-05-28 22:21:15

0

它將多於16個字節,因爲它也需要存儲密鑰。

你可以自己(直接)序列化滴答?另外;我沒有在這種情況下測試過,但你可能會給protobuf-net一個漩渦(它是一個高性能的二進制序列化引擎)。