Недавно я начал работать над агрегатором обмена криптовалют. По сути, я рассылаю запросы на множество разных бирж и сравниваю курсы. Это нужно сделать как можно быстрее. В этом посте я покажу некоторые настройки, которые я внес, чтобы значительно повысить свою производительность.
Однако имейте в виду, что я не эксперт (особенно в области го) и просто делюсь результатами своего личного проекта.
Эти улучшения расположены в порядке наибольшего улучшения среды выполнения.
В любой программе Go горутины необходимы для повышения скорости. Самым большим стимулом для меня стала одновременная отправка запросов. Поскольку мне нужно подключиться к 12 различным биржам, одновременная отправка этих запросов сократила время выполнения примерно с 24 секунд до всего ~3.
Горутины потрясающие и чрезвычайно простые в использовании. Вы должны включать их везде, где это возможно. Но всегда будьте осторожны с гонками данных
Я заменил кодировку/json на github.com/json-iterator/go.jsoniter — это библиотека быстрой обработки JSON, которая работает как замена стандартной библиотеки, поэтому мне не пришлось менять какой-либо код , просто переключатель библиотеки.
Результаты сравнительного теста
Чтобы оценить улучшение производительности, я провел несколько тестов, сравнивая кодировку/json и jsoniter. Вот краткий обзор результатов:
goos: linux goarch: amd64 pkg: apiSpeedImprove cpu: AMD Ryzen 5 7640U w/ Radeon 760M Graphics BenchmarkEncodingJSON-12 140383 7381 ns/op BenchmarkJSONIter-12 974605 1217 ns/op PASS ok apiSpeedImprove 3.216s
Итак, jsoniter примерно в 6 раз быстрее стандартной библиотеки.
Я начал повторно использовать обработчики HTTP вместо того, чтобы создавать новые для каждого запроса. Настроив обработчик один раз и повторно используя его, я сократил затраты на создание новых обработчиков для каждого запроса.
Результаты сравнительного теста
Вот результаты тестов, сравнивающих повторно используемые обработчики с созданием новых обработчиков для каждого запроса:
goos: linux goarch: amd64 pkg: apiSpeedImprove/httpReuse cpu: AMD Ryzen 5 7640U w/ Radeon 760M Graphics BenchmarkReusedHandler-12 2179 505189 ns/op BenchmarkNewHandlerPerRequest-12 2341 507525 ns/op PASS ok apiSpeedImprove/httpReuse 7.270s
Повторное использование обработчиков HTTP дало небольшой прирост производительности по сравнению с созданием нового обработчика для каждого запроса.
Благодаря этим настройкам мне удалось сократить время, необходимое для сбора всей информации, с 24 секунд на начальном этапе до примерно 2 секунд. Довольно солидное улучшение!
Если вас интересует код моих тестов, он доступен здесь
Если вам понравился этот пост и вы хотите поддержать мою работу, вы можете сделать пожертвование здесь.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3