Optimize binary encoding and decoding #30
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
С чего всё началось: заметил, что сервис, ходящий в Neo4j, под нагрузкой начинает много аллоцировать и много делать GC, при этом конечно время обработки запроса прыгает до нескольких секунд.
Профилировка с
-hT
указала, что на запросах создаётся много thunk'ов, а профилировка с-hc
указала наunpackAction
вhasbolt
.Изучение кода показало, что при декодинге происходят противоестественные манипуляции с
ByteString
и пакетомbinary
. Санки могут быть из-за нестрогогоmodify
, а ещё постоянное создание конструкторовBS
при откусывании по паре байт не есть хорошо. Плюс было много перегонов между ленивыми и строгими строками.В итоге решил переписать чтение и запись полностью на
binary
, отказавшись от ручных методов. Результаты бенчмарков:Было:
Стало:
TLDR: распаковка ускорилась в 6 раз, упаковка в ~2.
На потреблении памяти так же сказалось хорошо:
Было:
Стало:
Потребление меньше, пики не такие резкие, по статистике GC тоже видно, что стало лучше.