Maison > développement back-end > Golang > le corps du texte

Pourquoi le temps de compilation est-il plus lent avec `CGO_ENABLED=0` dans Go ?

DDD
Libérer: 2024-11-07 09:33:03
original
700 Les gens l'ont consulté

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

Ralentissement du temps de compilation avec CGO_ENABLED=0

Lors du développement de programmes Go liés au réseau, un écart important dans la vitesse de compilation peut être observé entre construit avec CGO_ENABLED=0 et ceux sans. Cela est évident même dans un exemple de serveur HTTP rudimentaire :

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)
    }
}
Copier après la connexion

Les tests de temps de compilation révèlent un ralentissement substantiel :

% 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
Copier après la connexion

Malgré l'absence de liaisons C directes, ce ralentissement persiste. La cause sous-jacente réside dans le processus de construction.

Le rôle des indicateurs de construction

CGO_ENABLED est l'un des nombreux indicateurs de construction utilisés lors de la compilation pour configurer les optimisations et inclure du code C. Lorsque cet indicateur est défini sur 0, les packages de bibliothèques standard prédéfinis ne peuvent pas être réutilisés. Par conséquent, une partie substantielle de la bibliothèque standard doit être recompilée, ce qui entraîne le ralentissement observé.

Approches alternatives

Lors de l'installation de packages pré-construits avec go build -i peut accélérer les futures builds avec CGO_ENABLED=0, cela ne résout pas le problème des builds sans CGO_ENABLED. Pour prendre en charge efficacement les deux configurations de build, des répertoires d'installation distincts doivent être utilisés via les indicateurs -installsuffix et -pkgdir. Cette ségrégation garantit que les packages construits avec des indicateurs différents ne s'écrasent pas.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal