Как ускорить boost::serialization ?
От: nen777w  
Дата: 30.11.15 22:27
Оценка:
Есть ли способ ускорить десериализацию построенную на subj?

По сути при десериализации есть много мелких операций (~400) десериализации значений типа unsigned int.
Хотя если брать суммарный объем данных (размер файла) из которых выполняется десериализация то он в среднем не больше 2kb.
И таких файлов не так и много около 30-ти штук.
И что самое неприятное, проблема проявляется только под Mac OS X, под Windows скорость работы вполне нормальная.

Что было уже сделано:
1) Переделка на memory_device, т.е. файл предварительно весь файл читается в буффер, на буфер натравляется memory_device + boost::iostreams и вся десериализация происходит над данными в памяти.
По показателям производительности (замерялось в debug):
Windows: ~14s
Mac OSX: ~86s

2) Пралельная десериализация. Т.е. запускается boost::thread::hardware_concurrency() * 2 -потоков и в каждом происходит десериализация.
Тут по показателям производительности вообще странные результаты (замерялось в debug):
Windows: ~4s
Mac OSX: ~105s

Т.е. под OSX она стала еще больше а под Windows еще меньше (как и ожидалось).

Приложение под OSX собирается clang-ом c ключами: -std=c++11 -O2 -msse2 -ffp-contract=fast

Использовать другую библиотеку увы не вариант, по той причине что нужна будет обратная совместимость архивов.
Спасибо.
Re: Как ускорить boost::serialization ?
От: Evgeny.Panasyuk Россия  
Дата: 30.11.15 23:36
Оценка:
Здравствуйте, nen777w, Вы писали:

N>По показателям производительности (замерялось в debug):


Почему debug?
Какой компилятор на Windows?

N>Приложение под OSX собирается clang-ом c ключами: -std=c++11 -O2 -msse2 -ffp-contract=fast


Для начала можно добавить -DNDEBUG и вместо O2 поставить O3.
Плюс запустить под чем-то типа callgrind.
Re[2]: Как ускорить boost::serialization ?
От: nen777w  
Дата: 01.12.15 07:28
Оценка:
EP>Почему debug?
Потому что OSX все равно в релизе очень намного уступает Windows.

EP>Какой компилятор на Windows?

MSVC 2012

N>>Приложение под OSX собирается clang-ом c ключами: -std=c++11 -O2 -msse2 -ffp-contract=fast

EP>Для начала можно добавить -DNDEBUG и вместо O2 поставить O3.
O3 не пробовал, не думаю что это что то даст, но попробую.

EP>Плюс запустить под чем-то типа callgrind.

Померяю, но когда то под VTune смотрел (под Windows правда) самый большой тормоз boost::serialize и его дремучий стек на каждую операцию.

Мне больше интересно почему OSX так сильно уступает Windows (да еще и с регрессией в многопоточном режиме).
Компилировал кстати приложение под Linux (release), т.е. замеров не делал, но по скорости (чисто на глаз) оно работает точно как и под Windows.
Re: Как ускорить boost::serialization ?
От: Zhendos  
Дата: 03.12.15 16:25
Оценка:
Здравствуйте, nen777w, Вы писали:

N>Есть ли способ ускорить десериализацию построенную на subj?


N>По сути при десериализации есть много мелких операций (~400) десериализации значений типа unsigned int.

N>Хотя если брать суммарный объем данных (размер файла) из которых выполняется десериализация то он в среднем не больше 2kb.
N>И таких файлов не так и много около 30-ти штук.
N>И что самое неприятное, проблема проявляется только под Mac OS X, под Windows скорость работы вполне нормальная.

Под Mac код 64битный, а под windows 32битная сборка или 64битная?
Re: Как ускорить boost::serialization ?
От: c-smile Канада http://terrainformatica.com
Дата: 04.12.15 02:18
Оценка:
Здравствуйте, nen777w, Вы писали:

30 файлов по 2k каждый, т.е. 60k данных за 14s это про что вообще? Ты ничего не перепутал?
Re: Как ускорить boost::serialization ?
От: Evgeniy Skvortsov Россия  
Дата: 04.12.15 08:28
Оценка:
Здравствуйте, nen777w, Вы писали:

N>Есть ли способ ускорить десериализацию построенную на subj?


Nixman писал свою сериализацию, кажется YAS называется.
Насколько помню, у него получилось очень значительное ускорение, и кажется совместимость бинарная есть
Отредактировано 04.12.2015 8:30 Evgeniy Skvortsov . Предыдущая версия .
Re[2]: Как ускорить boost::serialization ?
От: PM  
Дата: 06.12.15 17:24
Оценка:
Здравствуйте, Evgeniy Skvortsov, Вы писали:

ES>Nixman писал свою сериализацию, кажется YAS называется.

ES>Насколько помню, у него получилось очень значительное ускорение, и кажется совместимость бинарная есть

По-моему, бинарной совместимости нет, но скорость выше да, опережает остальных конкурентов: https://github.com/STEllAR-GROUP/cpp-serializers/pull/2
Re[2]: Как ускорить boost::serialization ?
От: nen777w  
Дата: 06.12.15 19:04
Оценка: 6 (1) :)
CS>30 файлов по 2k каждый, т.е. 60k данных за 14s это про что вообще? Ты ничего не перепутал?

Сори не заходил сюда. Перепутал да.

Дело оказалось не в сериализации а в:
struct base_item {
  boost::uuid m_id;
  base_item() : m_id(boost::uuids::random_generator()()) {} 
};


Что на маке в силу реализации random_generator() приводило к тормозам (~14s Win против ~86s Mac).

Т.е. сперва создавался потомок base_item а потом к нему применялась десериализация, что приводило к излишней инициализации m_id т.к. она всеравно тут же "десериализировалась".
Во общем переписывание процедуры десериализации и введение специального способа конструирования объектов для этого, проблему решило.
Re[2]: Как ускорить boost::serialization ?
От: niXman Ниоткуда https://github.com/niXman
Дата: 14.12.15 15:20
Оценка:
Здравствуйте, Evgeniy Skvortsov, Вы писали:

ES>... кажется совместимость бинарная есть

нет, хотя была такая идея. и реализовать вроде как не сложно, но надобности небыло...
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.