CGO_ENABLED=0 でコンパイル時間が遅くなる
ネットワークベースの Go プログラムを開発する場合、CGO_ENABLED=0 でコンパイルすると大幅な速度低下が発生する可能性がありますCGO_ENABLED=1 と比較。これは、基本的な HTTP サーバーの場合のように、C バインディングが使用されていない場合でも観察されます。
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) } }
CGO_ENABLED=0 の場合、コンパイル時間が大幅に遅くなります:
% 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
速度低下の原因
コンパイル時間の違いは、標準ライブラリ パッケージへの依存関係から発生します。 CGO_ENABLED=1 の場合、これらのパッケージは必要なフラグを使用してビルドされますが、CGO_ENABLED=0 の場合はビルドされません。
フラグのない標準ライブラリ パッケージは CGO_ENABLED=0 では使用できず、ライブラリの大部分が強制的に使用されます。再建された。これにより、コンパイル時間が大幅に増加します。
速度低下の軽減
解決策の 1 つは、 go build -i を使用して、必要なフラグを持つ事前ビルドされたパッケージをインストールすることです。ただし、このアプローチには独自の課題が伴います。 CGO_ENABLED=0 を指定せずにビルドされたパッケージをインストールすると、CGO_ENABLED=0 を指定しない今後のビルドは高速化されますが、CGO_ENABLED=0 を指定したビルドは遅くなります。
この問題に対処するには、-installsuffix フラグや -pkgdir フラグを使用することをお勧めします。これにより、使用されるコンパイル フラグに基づいて、異なるパッケージのインストール ディレクトリが許可されます。これにより、さまざまなフラグを使用して効率的なビルドが可能になります。
以上がC バインディングがない場合でも、「CGO_ENABLED=0」を使用すると Go のコンパイルが遅くなるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。