Ускорить двоичную сериализацию - почему побитовое копирование работает только для коллекций?

Используя ускоренную сериализацию, я пытаюсь найти лучшие настройки для быстрой двоичной сериализации больших объектов. Мои тесты показывают, что для структуры, помеченной побитовой сериализацией, я получаю лучшую производительность только для массивов (и векторов), а не для отдельных объектов.

Например, скажем, у меня есть эта структура, состоящая только из типов POD

struct BigStruct
{
  double    m1;
  long long m2;
  float     m3;
  // ...
  bool      m499;
  short     m500;
};

namespace boost
{
  namespace serialization
  {
    template <class Archive>
    void serialize(Archive& ioArchive, BigStruct& ioStruct, const unsigned int iVersion)
    {
      ioArchive & ioStruct.m1;
      ioArchive & ioStruct.m2;
      ioArchive & ioStruct.m3;
      // ...
      ioArchive & ioStruct.m499;
      ioArchive & ioStruct.m500;
    }
  }
}

#include <boost/serialization/is_bitwise_serializable.hpp>
BOOST_IS_BITWISE_SERIALIZABLE(BigStruct);

Затем сериализация одного объекта

{
  std::ofstream outStream(tmpFolder + "/BinarySerializationOfBigStruct.txt", std::ios_base::binary);
  boost::archive::binary_oarchive binOutArchive(outStream, boost::archive::no_header);

  BigStruct bigStruct;

  std::clock_t c_start = std::clock();
  binOutArchive << bigStruct;
  std::clock_t c_end = std::clock();

  // ...compute elapsed time...
}

занимает примерно в 7 раз больше, чем сериализация массива из 1 объекта

{
  std::ofstream outStream(tmpFolder + "/BinarySerializationOfBigStructArray.txt", std::ios_base::binary);
  boost::archive::binary_oarchive binOutArchive(outStream, boost::archive::no_header);

  BigStruct bigStructArray[1];

  std::clock_t c_start = std::clock();    
  binOutArchive << bigStructArray;
  std::clock_t c_end = std::clock();

  // ...compute elapsed time...
}

Я что-то пропустил? Это упущение в ускоренной сериализации?

Кстати я использую boost v1.53.

0 ответов

Другие вопросы по тегам