Если бы мне пришлось выбрать самый большой недостаток Boost.Serialization, это было бы плохой производительностью.Если 400 мс действительно слишком медленные, либо получите более быстрое оборудование, либо переключитесь на другую библиотеку сериализации.
Тем не менее, на случай, если вы делаете что-то явно «неправильное», вы должны опубликовать код сериализации для * 1003.*, Container::SmallObject
и Container::SmallObject::CustomData
.Вы также должны убедиться, что на самом деле десериализация занимает 400 мс, а не комбинацию десериализации + чтения данных с диска;то есть загрузить данные в какой-то поток памяти и десериализовать их, а не десериализовать из std::fstream
.
EDIT (в ответ на комментарии):
Этот код работает для меня, используя VC ++ 2010 SP1 и Boost 1.47 beta:
double loadArchive(std::string const& archiveFileName, Container& data)
{
std::ifstream fileStream(
archiveFileName.c_str(),
std::ios_base::binary | std::ios_base::in
);
std::stringstream buf(
std::ios_base::binary | std::ios_base::in | std::ios_base::out
);
buf << fileStream.rdbuf();
fileStream.close();
StartCounter();
boost::archive::binary_iarchive(buf) >> data;
return GetCounter();
}
Если это не работает для вас, он должен быть привязан к компилятору и / или версииBoost, который вы используете (что к чему?).
На моем компьютере для сборки выпуска x86 (с включенной генерацией кода времени соединения) загрузка данных с диска составляет ~ 9% от общего временивзятый для десериализации файла размером 1,28 МБ (1 Container
, содержащий 13000 SmallObject
экземпляров, каждый из которых содержит 4 CustomData
экземпляров);для сборки выпуска x64 загрузка данных с диска составляет ~ 17% от общего времени, необходимого для десериализации файла размером 1,53 МБ (столько же объектов).