Rumah > pembangunan bahagian belakang > Golang > Mengapakah kompilasi Go lebih perlahan dengan `CGO_ENABLED=0` walaupun tanpa pengikatan C?

Mengapakah kompilasi Go lebih perlahan dengan `CGO_ENABLED=0` walaupun tanpa pengikatan C?

Linda Hamilton
Lepaskan: 2024-11-07 00:25:02
asal
917 orang telah melayarinya

Why is Go compilation slower with `CGO_ENABLED=0` even without C bindings?

Perlahan Masa Kompilasi dengan CGO_ENABLED=0

Apabila membangunkan program Go berasaskan rangkaian, menyusun dengan CGO_ENABLED=0 boleh mengakibatkan kelembapan yang ketara berbanding dengan CGO_ENABLED=1. Ini diperhatikan walaupun apabila tiada pengikatan C digunakan, seperti dalam kes pelayan HTTP asas:

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)
    }
}
Salin selepas log masuk

Masa kompilasi jauh lebih perlahan apabila 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
Salin selepas log masuk

Punca Kelembapan

Perbezaan dalam masa penyusunan timbul daripada pergantungan pada pakej perpustakaan standard. Apabila CGO_ENABLED=1, pakej ini dibina dengan bendera yang diperlukan, tetapi apabila CGO_ENABLED=0, ia tidak.

Pakej perpustakaan standard tanpa bendera tidak boleh digunakan dengan CGO_ENABLED=0, memaksa kebanyakan perpustakaan menjadi dibina semula. Ini meningkatkan masa penyusunan dengan ketara.

Mengurangkan Kelembapan

Satu penyelesaian ialah memasang pakej pra-bina dengan bendera yang dikehendaki menggunakan go build -i. Walau bagaimanapun, pendekatan ini memperkenalkan cabarannya sendiri. Memasang pakej yang dibina tanpa CGO_ENABLED=0 mempercepatkan binaan masa hadapan tanpa CGO_ENABLED=0 tetapi memperlahankan binaan dengan CGO_ENABLED=0.

Untuk menangani isu ini, adalah dinasihatkan untuk menggunakan tanda -installsuffix dan/atau -pkgdir, yang membenarkan direktori pemasangan pakej berbeza berdasarkan bendera kompilasi yang digunakan. Ini membolehkan binaan cekap dengan bendera yang berbeza.

Atas ialah kandungan terperinci Mengapakah kompilasi Go lebih perlahan dengan `CGO_ENABLED=0` walaupun tanpa pengikatan C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan