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

Linda Hamilton
Lepaskan: 2024-11-07 00:25:02
asal
796 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!

sumber:php.cn
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
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!