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 중국어 웹사이트의 기타 관련 기사를 참조하세요!