J'ai récemment commencé à travailler sur un agrégateur d'échange de crypto-monnaie. Fondamentalement, j’envoie des demandes à un certain nombre d’échanges différents et je compare les tarifs. Cela doit être fait le plus rapidement possible. Dans cet article, je vais montrer quelques ajustements que j'ai apportés afin d'améliorer considérablement mes performances.
Gardez cependant à l'esprit que je ne suis pas un expert (surtout en go) et que je partage simplement mes découvertes issues de mon projet personnel.
Ces améliorations sont classées par ordre d'amélioration du temps d'exécution.
Dans tout programme Go, les goroutines sont essentielles à la vitesse. Le plus gros coup de pouce que j’ai apporté a été l’envoi simultané de demandes. Comme je dois effectuer 12 échanges différents, l'envoi de ces demandes en même temps a réduit mon temps d'exécution d'environ 24 secondes à seulement ~ 3.
Les Goroutines sont étonnantes et extrêmement faciles à utiliser. Vous devez les inclure dans la mesure du possible. Mais faites toujours attention aux Data Races
J'ai remplacé encoding/json par github.com/json-iterator/go.jsoniter, une bibliothèque de traitement JSON rapide qui fonctionne en remplacement de la bibliothèque standard, je n'ai donc pas eu à modifier de code , juste un changement de bibliothèque.
Résultats de référence
Pour mesurer les améliorations de performances, j'ai effectué quelques tests comparant encoding/json et jsoniter. Voici un résumé des résultats :
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
Ainsi, jsoniter est environ 6 fois plus rapide que la bibliothèque standard.
J'ai commencé à réutiliser les gestionnaires HTTP au lieu d'en créer de nouveaux pour chaque requête. En configurant un gestionnaire une fois et en le réutilisant, j'ai réduit les frais généraux liés à la création de nouveaux gestionnaires pour chaque demande.
Résultats de référence
Voici les résultats des benchmarks comparant les gestionnaires réutilisés à la création de nouveaux gestionnaires pour chaque requête :
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
La réutilisation des gestionnaires HTTP a légèrement amélioré les performances par rapport à la création d'un nouveau gestionnaire pour chaque requête.
Grâce à ces ajustements, j'ai réussi à réduire le temps nécessaire pour rassembler toutes les informations de 24 secondes initialement à environ 2 secondes. Amélioration assez solide !
Si le code de mes benchmarks vous intéresse, il est disponible ici
Si vous avez apprécié cet article et souhaitez soutenir mon travail, vous pouvez faire un don ici.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!