Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Optimize binary encoding and decoding #30

Merged
merged 6 commits into from
Jul 6, 2021

Conversation

maksbotan
Copy link
Collaborator

С чего всё началось: заметил, что сервис, ходящий в Neo4j, под нагрузкой начинает много аллоцировать и много делать GC, при этом конечно время обработки запроса прыгает до нескольких секунд.

Профилировка с -hT указала, что на запросах создаётся много thunk'ов, а профилировка с -hc указала на unpackAction в hasbolt.

Изучение кода показало, что при декодинге происходят противоестественные манипуляции с ByteString и пакетом binary. Санки могут быть из-за нестрогого modify, а ещё постоянное создание конструкторов BS при откусывании по паре байт не есть хорошо. Плюс было много перегонов между ленивыми и строгими строками.

В итоге решил переписать чтение и запись полностью на binary, отказавшись от ручных методов. Результаты бенчмарков:

Было:
image

                    | lower bound | estimate | upper bound
OLS regression      | 24.0 μs     | 24.1 μs  | 24.2 μs
R² goodness-of-fit  | 1.00.       | 1.00     | 1.00
Mean execution time | 23.6 μs     | 23.8 μs  | 24.0 μs
Standard deviation  | 445 ns      | 586 ns   | 806 ns

Стало:
image

                    | lower bound | estimate | upper bound
OLS regression      | 3.92 μs     | 3.94 μs  | 3.97 μs
R² goodness-of-fit  | 0.999       | 1.00     | 1.00
Mean execution time | 3.91 μs     | 3.93 μs  | 3.97 μs
Standard deviation  | 57.1 ns     | 84.0 ns  | 139 ns

TLDR: распаковка ускорилась в 6 раз, упаковка в ~2.

На потреблении памяти так же сказалось хорошо:

Было:
telegram-cloud-photo-size-2-5404388294252409926-y

Стало:
telegram-cloud-photo-size-2-5404388294252409925-y

Потребление меньше, пики не такие резкие, по статистике GC тоже видно, что стало лучше.

@zmactep zmactep merged commit dc8c166 into zmactep:master Jul 6, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants