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

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

Например, скажем, у меня есть эта структура, состоящая только из типов 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.

4

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector