Ускорить двоичную сериализацию - почему побитовое копирование работает только для коллекций?
Используя ускоренную сериализацию, я пытаюсь найти лучшие настройки для быстрой двоичной сериализации больших объектов. Мои тесты показывают, что для структуры, помеченной побитовой сериализацией, я получаю лучшую производительность только для массивов (и векторов), а не для отдельных объектов.
Например, скажем, у меня есть эта структура, состоящая только из типов 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.