ホームページ  >  記事  >  バックエンド開発  >  Go で「CGO_ENABLED=0」を使用するとコンパイル時間が遅くなるのはなぜですか?

Go で「CGO_ENABLED=0」を使用するとコンパイル時間が遅くなるのはなぜですか?

DDD
DDDオリジナル
2024-11-07 09:33:03661ブラウズ

Why is Compilation Time Slower with `CGO_ENABLED=0` in Go?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。