C 바인딩 없이도 CGO_ENABLED가 컴파일 속도를 늦출 수 있는 이유
네트워크 사용과 관련된 프로그램을 생성할 때 컴파일에 CGO_ENABLED를 활성화하면 다음과 같은 결과가 발생할 수 있습니다. 상당한 둔화. 이는 프로그램이 C 코드와 상호 작용하지 않는 경우에도 발생합니다. 다음과 같은 간단한 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
그 이유는 표준 라이브러리의 패키지가 플래그 없이 컴파일되기 때문입니다. . CGO_ENABLED가 설정되면 컴파일 플래그가 변경됩니다. 즉, 사전 빌드된 패키지를 더 이상 사용할 수 없습니다. 따라서 표준 라이브러리의 상당 부분을 다시 컴파일해야 합니다.
go build -i를 통해 패키지를 설치하면 이 문제를 완화할 수 있지만 고유한 단점도 있습니다. CGO_ENABLED=0으로 빌드된 패키지를 설치하면 향후 빌드 속도가 향상되지만 이를 사용하지 않는 빌드 속도도 느려집니다.
이 충돌을 해결하려면 -installsuffix 및/또는 -pkgdir 플래그 사용을 고려하세요. 다양한 컴파일 모드에 대해 별도의 디렉토리를 생성하여 빌드 효율성을 최적화하고 CGO_ENABLED를 사용한 컴파일과 관련된 지연을 제거합니다.
위 내용은 C 바인딩 없이도 CGO_ENABLED를 활성화하면 컴파일 속도가 느려지는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!