Go에서 `CGO_ENABLED=0`을 사용하면 컴파일 시간이 느려지는 이유는 무엇입니까?

DDD
풀어 주다: 2024-11-07 09:33:03
원래의
701명이 탐색했습니다.

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

CGO_ENABLED=0으로 컴파일 시간이 느려짐

네트워크 관련 Go 프로그램을 개발할 때 두 프로그램 사이의 컴파일 속도에 상당한 차이가 관찰될 수 있습니다. 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 코드를 포함하기 위해 컴파일 중에 사용되는 많은 빌드 플래그 중 하나입니다. 이 플래그가 0으로 설정되면 사전 빌드된 표준 라이브러리 패키지를 재사용할 수 없습니다. 결과적으로 표준 라이브러리의 상당 부분을 다시 컴파일해야 하며 이로 인해 속도가 느려지는 현상이 관찰됩니다.

대체 접근 방식

go build -i를 사용하여 사전 빌드된 패키지를 설치하는 동안 CGO_ENABLED=0을 사용하면 향후 빌드를 가속화할 수 있지만 CGO_ENABLED가 없는 빌드의 문제는 해결되지 않습니다. 두 빌드 구성을 효율적으로 지원하려면 -installsuffix 및 -pkgdir 플래그를 통해 별도의 설치 디렉터리를 활용해야 합니다. 이러한 분리는 서로 다른 플래그로 빌드된 패키지가 서로 덮어쓰지 않도록 보장합니다.

위 내용은 Go에서 `CGO_ENABLED=0`을 사용하면 컴파일 시간이 느려지는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿