Двоичная сериализация массива DateTime - PullRequest
1 голос
/ 29 мая 2009

Когда я сериализирую массив 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 действительно сериализуется в двоичный файл?

Ответы [ 2 ]

0 голосов
/ 29 мая 2009

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

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

0 голосов
/ 29 мая 2009

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

...