私は最近、暗号通貨交換アグリゲーターに取り組み始めました。基本的に、私はさまざまな取引所にリクエストを送信し、レートを比較します。これはできるだけ早く行う必要があります。この投稿では、パフォーマンスを大幅に向上させるために行った調整をいくつか紹介します。
ただし、私は (特に Go の) 専門家ではなく、私自身の個人プロジェクトから得た発見を共有しているだけであることに留意してください。
これらの改善点は、ランタイムの改善が最も大きかった順に記載されています。
どの Go プログラムでも、速度を上げるためにゴルーチンは不可欠です。私が行った最大の効果は、リクエストを同時に送信したことです。 12 の異なる取引所にアクセスする必要があるため、これらのリクエストを同時に送信すると、ランタイムが約 24 秒からわずか約 3 秒に短縮されました。
Goroutine は素晴らしく、非常に使いやすいです。可能な限りそれらを含める必要があります。ただし、データ競合には常に注意してください
encoding/json を github.com/json-iterator/go.jsoniter に置き換えました。これは、標準ライブラリのドロップイン置換として機能する高速 JSON 処理ライブラリであるため、コードを変更する必要はありませんでした。 、単なるライブラリのスイッチです。
ベンチマーク結果
パフォーマンスの向上を測定するために、encoding/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 ハンドラーを作成するのではなく、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 秒に短縮することができました。かなり確実に改善されました!
私のベンチマークのコードに興味がある場合は、ここから入手できます
この投稿を気に入っていただき、私の活動をサポートしたい場合は、ここから寄付していただけます。
以上がGolang API リクエストのパフォーマンスの向上の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。