C バインディングがない場合でも CGO_ENABLED がコンパイル速度を低下させる理由
ネットワークの使用を伴うプログラムを作成する場合、コンパイルで CGO_ENABLED を有効にすると、大幅な減速。これは、プログラムが C コードと対話しない場合でも発生します。次の単純な 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
この理由は、標準ライブラリ内のパッケージがフラグなしでコンパイルされるためです。 。 CGO_ENABLED が設定されると、コンパイル フラグが変更されます。これは、これらの事前構築済みパッケージが使用できなくなることを意味します。したがって、標準ライブラリの大部分を再コンパイルする必要があります。
go build -i を使用してパッケージをインストールすると、この問題を軽減できますが、これには独自の欠点もあります。 CGO_ENABLED=0 でビルドされたパッケージをインストールすると、今後のビルドの速度が向上しますが、それを使用しないビルドの速度も低下します。
この競合を解決するには、-installsuffix フラグや -pkgdir フラグの使用を検討してください。これにより、異なるコンパイル モードに対して個別のディレクトリが作成され、ビルド効率が最適化され、CGO_ENABLED でのコンパイルに伴う遅延が排除されます。
以上がC バインディングがない場合でも、CGO_ENABLED を有効にするとコンパイルが遅くなるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。