Rumah >pembangunan bahagian belakang >Golang >Mengapakah Mendayakan CGO_ENABLED Memperlahankan Kompilasi, Walaupun Tanpa Pengikatan C?

Mengapakah Mendayakan CGO_ENABLED Memperlahankan Kompilasi, Walaupun Tanpa Pengikatan C?

Patricia Arquette
Patricia Arquetteasal
2024-11-26 03:29:08189semak imbas

Why Does Enabling CGO_ENABLED Slow Down Compilation, Even Without C Bindings?

Mengapa CGO_ENABLED Boleh Melambatkan Kompilasi, Walaupun Tanpa C Bindings

Apabila mencipta program yang melibatkan penggunaan rangkaian, mendayakan CGO_ENABLED untuk kompilasi boleh mengakibatkan kelembapan yang ketara. Ini berlaku walaupun program tidak berinteraksi dengan kod C. Pertimbangkan pelayan HTTP mudah berikut:

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)
    }
}

Perbandingan masa kompilasi mendedahkan perbezaan yang ketara:

% 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

Alasannya ialah pakej dalam perpustakaan standard disusun tanpa bendera . Apabila CGO_ENABLED ditetapkan, ia menukar bendera kompilasi, yang bermaksud bahawa pakej pra-bina ini tidak boleh digunakan lagi. Oleh itu, sebahagian besar perpustakaan standard mesti dikompilasi semula.

Semasa memasang pakej melalui go build -saya boleh mengurangkan isu ini, ia datang dengan kelemahannya sendiri. Memasang pakej yang dibina dengan CGO_ENABLED=0 akan meningkatkan kelajuan binaan masa hadapan, tetapi ia juga akan memperlahankan binaan yang tidak menggunakannya.

Untuk menyelesaikan konflik ini, pertimbangkan untuk menggunakan bendera -installsuffix dan/atau -pkgdir, yang mencipta direktori berasingan untuk mod kompilasi berbeza, mengoptimumkan kecekapan binaan dan menghapuskan kelewatan yang dikaitkan dengan menyusun dengan CGO_ENABLED.

Atas ialah kandungan terperinci Mengapakah Mendayakan CGO_ENABLED Memperlahankan Kompilasi, Walaupun Tanpa Pengikatan C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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