Постановка задачи
● Задача – сменить библиотеку json;
● Json использовался в качестве внутреннего
формата данных;
● Использование шаблонов выражений для
уменьшения кода.
Зачем все это было?
● Исследование показало, что операции с
json занимали не меньше 20 % времени;
● Rapidjson read rate 140 МБ/с
(худший);
● Cpprest sdk 13 МБ/с.
Исследуем код cpprest
l Используется move семантика;
l Элементы могут быть сортированы –
бинарный поиск;
l Элементы полиморфные;
l Поставляется в виде отдельной
библиотеки.
Исследуем код Rapidjson
l Кастомные аллокаторы;
l Микрооптимизации Neon/sse;
l header only – уровень оптимизации
определяется основным кодом.
Сравнительный тест
производительности (-O3).
l Nativejson benchmark (для некоторого i5 3
поколения)
Benchmarking Performance of C++ REST SDK (C++11)
Parse canada.json ... 162.880 ms 13.180 MB/s
Parse citm_catalog.json ... 23.060 ms 71.431 MB/s
Parse twitter.json ... 10.985 ms 54.826 MB/s
Benchmarking Performance of RapidJSON_FullPrec (C++)
Parse canada.json ... 15.184 ms 141.384 MB/s
Parse citm_catalog.json ... 3.109 ms 529.813 MB/s
Parse twitter.json ... 2.084 ms 288.992 MB/s
Сравнительный тест
производительности (-O0).
l Nativejson benchmark (для некоторого i5 3
поколения)
Benchmarking Performance of C++ REST SDK (C++11)
Parse canada.json ... 166.016 ms 12.931 MB/s
Parse citm_catalog.json ... 23.549 ms 69.947 MB/s
Parse twitter.json ... 11.044 ms 54.533 MB/s
Benchmarking Performance of RapidJSON_FullPrec (C++)
Parse canada.json ... 139.193 ms 15.423 MB/s
Parse citm_catalog.json ... 25.075 ms 65.691 MB/s
Parse twitter.json ... 10.639 ms 56.609 MB/s
Шаблоны выражений
l Быстрая, но громозкая реализация;
l Оборачиваем шаблоном, с более
короткой реализацией;
l Требуется оптимизация кода;
l Код по скорости близок к
идеальному.
Benchmark
gcc 9.2.0 (-O3)
Run on (8 X 3400 MHz CPU s)
CPU Caches:
L1 Data 32K (x4)
L1 Instruction 32K (x4)
L2 Unified 256K (x4)
L3 Unified 6144K (x1)
Load Average: 0.33, 0.35, 0.21
-----------------------------------------------------
Benchmark Time CPU Iterations
-----------------------------------------------------
Ideal 255 ns 255 ns 2693296
SuperFast 346 ns 346 ns 2007497
Benchmark
gcc 9.2.0 (-O0)
Run on (8 X 3400 MHz CPU s)
CPU Caches:
L1 Data 32K (x4)
L1 Instruction 32K (x4)
L2 Unified 256K (x4)
L3 Unified 6144K (x1)
Load Average: 0.33, 0.35, 0.21
-----------------------------------------------------
Benchmark Time CPU Iterations
-----------------------------------------------------
Ideal 10123 ns 10119 ns 63845
SuperFast 40989 ns 40971 ns 13674
Итог
l Rapidjson быстр, но требует оптимизацию
l Шаблоны выражений требуют
оптимизацию.
l Тестовая библиотека дает
- Rapidjson 15-25 МБ/с
- Cpp rest sdk 13 МБ/с