Двоичная сериализация массива DateTime

Когда я сериализую массив Int32 с помощью BinaryFormatter, я получаю около 400 МБ / с (100 миллионов элементов за одну секунду), но когда я пытаюсь сериализовать массив DateTime, я получаю только пропускную способность около 27 МБ / с (100 миллионов элементы за 30 секунд). Один 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 действительно сериализуется в двоичный код?


person Rauhotz    schedule 28.05.2009    source источник


Ответы (2)


Похоже, что вы привязаны к вводу-выводу при сериализации int, но вы привязаны к ЦП для сериализации DateTime (по-видимому, для сериализации DateTime требуется гораздо больше процессорного времени, чем для сериализации int). Следовательно, ваши измерения не будут отражать точное соотношение между двумя вашими размерами типов данных.

person Robert Harvey    schedule 28.05.2009
comment
Меры были выполнены путем сериализации в MemoryStream, поэтому операций ввода-вывода не было. - person Rauhotz; 29.05.2009
comment
Хорошо, значит, вы не связаны с вводом-выводом, но сериализация DateTime, по-видимому, занимает в 30 раз больше времени, чем int. - person Robert Harvey; 29.05.2009

Это будет больше 16 байт, так как в нем тоже нужно хранить ключи.

Вы могли бы сами (напрямую) сериализовать тики? Альтернативно; Я не тестировал его в этом сценарии, но вы можете дать protobuf-net водоворот (это высокопроизводительный механизм двоичной сериализации).

person Marc Gravell    schedule 28.05.2009
comment
100 миллионов DateTimes дают мне длину потока ~ 800 МБ, поэтому BinaryFormatter, похоже, хранит что-то вроде тиков, но, к сожалению, довольно медленно. - person Rauhotz; 29.05.2009