CGO_ENABLED=0 によるコンパイル時間の低下
ネットワーク関連の Go プログラムを開発する場合、次のプログラムとCGO_ENABLED=0 を指定してビルドする場合と、CGO_ENABLED=0 を使用しない場合にビルドします。これは、初歩的な HTTP サーバーの例でも明らかです。
package main import ( "flag" "fmt" "log" "net/http" ) func handler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hi! glad you requested %s.\n", r.URL.Path[1:]) } func main() { port := flag.Int("port", 9000, "") flag.Parse() http.HandleFunc("/", handler) err := http.ListenAndServe(fmt.Sprintf(":%d", *port), nil) if err != nil { log.Fatal(err) } }
コンパイル時間のベンチマークにより、大幅な速度低下が明らかになりました。
% time go build go build 0.46s user 0.06s system 131% cpu 0.396 total % time CGO_ENABLED=0 go build CGO_ENABLED=0 go build 3.93s user 0.15s system 143% cpu 2.849 total
直接 C バインディングがないにもかかわらず、この速度低下は持続します。根本的な原因はビルド プロセスにあります。
ビルド フラグの役割
CGO_ENABLED は、最適化を構成して C コードを含めるためにコンパイル中に使用される多くのビルド フラグの 1 つです。このフラグが 0 に設定されている場合、事前に構築された標準ライブラリ パッケージは再利用できません。その結果、標準ライブラリのかなりの部分を再コンパイルする必要があり、速度低下が観察されます。
代替アプローチ
go build -i を使用してビルド済みパッケージをインストールする場合CGO_ENABLED=0 を使用すると今後のビルドを高速化できますが、CGO_ENABLED を使用しないビルドの問題は解決されません。両方のビルド構成を効率的にサポートするには、-installsuffix フラグと -pkgdir フラグを使用して別のインストール ディレクトリを使用する必要があります。この分離により、異なるフラグを使用してビルドされたパッケージが相互に上書きされないことが保証されます。
以上がGo で「CGO_ENABLED=0」を使用するとコンパイル時間が遅くなるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。