Recentemente comecei a trabalhar em um agregador de exchanges de criptomoedas. Basicamente, envio solicitações para várias exchanges diferentes e comparo taxas. Isto tem que ser feito o mais rápido possível. Neste post, vou mostrar alguns ajustes que fiz para melhorar significativamente meu desempenho.
No entanto, tenha em mente que não sou um especialista (especialmente em Go) e estou apenas compartilhando minhas descobertas de meu próprio projeto pessoal.
Essas melhorias vêm na ordem de maior melhoria no tempo de execução.
Em qualquer programa Go, goroutines são essenciais para velocidade. O maior impulso que consegui foi enviar solicitações simultaneamente. Como preciso acessar 12 exchanges diferentes, enviar essas solicitações ao mesmo tempo reduziu meu tempo de execução de cerca de 24 segundos para apenas aproximadamente 3.
Goroutines são incríveis e extremamente fáceis de usar. Você deve incluí-los sempre que possível. Mas sempre tome cuidado com as corridas de dados
Troquei encoding/json por github.com/json-iterator/go.jsoniter é uma biblioteca de processamento JSON rápido que funciona como um substituto imediato para a biblioteca padrão, então não precisei alterar nenhum código , apenas uma troca de biblioteca.
Resultados de referência
Para medir as melhorias de desempenho, executei alguns benchmarks comparando encoding/json e jsoniter. Aqui está um resumo dos resultados:
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
Portanto, jsoniter é cerca de 6 vezes mais rápido que a biblioteca padrão.
Comecei a reutilizar manipuladores HTTP em vez de criar novos para cada solicitação. Ao configurar um manipulador uma vez e reutilizá-lo, reduzi a sobrecarga de criar novos manipuladores para cada solicitação.
Resultados de referência
Aqui estão os resultados dos benchmarks comparando manipuladores reutilizados versus a criação de novos manipuladores para cada solicitação:
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
A reutilização de manipuladores HTTP proporcionou um ligeiro aumento de desempenho em comparação com a criação de um novo manipulador para cada solicitação.
Com esses ajustes consegui reduzir o tempo necessário para reunir todas as informações de 24 segundos inicialmente para cerca de 2 segundos. Melhoria bastante sólida!
Se você estiver interessado no código dos meus benchmarks, ele está disponível aqui
Se você gostou deste post e quer apoiar meu trabalho, você pode doar aqui.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3