Go パフォーマンス最適化ガイド: マスター Go pprof Go 言語には pprof パフォーマンス分析ツールが用意されており、次の手順で最適化できます。 Go pprof ツールをインストールします: go install golang.org/x/perf/cmd/pprof@パフォーマンス分析を生成する最新のファイル: pprof -seconds=5 http-server.exe 分析 パフォーマンス プロファイリング ファイル: pprof http-server.exe、コマンド ライン ツールの top、flamegraph、callgraph、および web コマンドを使用して、メモリ、CPU、および時間。実際のケース: *http.Handler インスタンスを解放するようにコードを最適化することでメモリ リークを修正し、プログラムの効率を大幅に向上させます。
Go 言語は、開発者に役立つ強力なパフォーマンス分析ツール pprof を提供します。プログラムのパフォーマンスのボトルネックを特定して最適化します。この記事では、パフォーマンス分析に pprof を使用する方法を紹介し、実際のケースを通じて Go コードを最適化する方法を示します。
go install golang.org/x/perf/cmd/pprof@latest
pprof -seconds=5 http-server.exe
pprof によって生成されたファイルは、対話型コマンド ライン ツールを使用して表示および分析できます。
pprof http-server.exe
top
: 時間、CPU、メモリを最も消費する関数を表示します。 flamegraph
: フレーム グラフを生成して、関数呼び出しの時間分布を視覚化します。 callgraph
: 関数間の呼び出し関係を示すコール グラフを生成します。 web
: すべての分析機能を提供する対話型 Web インターフェイスを起動します。 次は、メモリ リークの問題が発生する単純化された Go コードの例です:
package main import ( "fmt" "runtime" "github.com/gorilla/mux" ) func main() { router := mux.NewRouter() router.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {}) // 在处理请求中创建大量的空结构体 for i := 0; i < 10000; i++ { router.HandleFunc(fmt.Sprintf("/%d", i), func(w http.ResponseWriter, r *http.Request) {}) } }
pprof -allocspace=1024 http-server.exe
pprof http-server.exe
top -sort=inuse
出力には、次のような最も多く割り当てられたオブジェクト タイプが表示されます。
Flat profile: alloc space = 1.05 GiB Node count Node alloc bytes 1 1.05 GiB <nil>
これは、プログラムは大量の *http.Handler
インスタンスを生成しますが、これらのインスタンスはリクエストの処理後に解放されることはありません。
メモリ リークを修正するには、コードを変更し、不要になったときに手動で解放します。*http.Handler
例:
for i := 0; i < 10000; i++ { path := fmt.Sprintf("/%d", i) router.Handle(path, http.HandlerFunc(myHandler)).Methods(http.MethodGet) runtime.SetFinalizer(&router.Handlers[path], func(h http.Handler) { h.ServeHTTP(nil, nil) router.Remove(path) }) }
最適化されたコードを使用してプログラムを再実行し、メモリ プロファイリング ファイルを生成すると、メモリ リークが解決されたことがわかります:
Flat profile: alloc space = 20 MiB Node count Node alloc bytes 1 20 MiB <nil>
pprof は、開発者が Go コードのパフォーマンスを特定して最適化するのに役立つ強力なツールです。 pprof プロファイリング ファイルの生成および分析方法を理解することで、開発者はパフォーマンスの問題を迅速に特定して解決し、プログラムの効率を大幅に向上させることができます。
以上がGo パフォーマンス最適化ガイド: Go pprof をマスターするの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。