tạo một tệp có tên main.go
, hãy thử với chương trình hello world đơn giản.
package main
import "fmt"
func main(){
fmt.Println("Hello World!")
}
Tôi sử dụng go phiên bản 1.9.1
$ go version
go version go1.9.1 linux/amd64
Biên dịch với go build
lệnh chuẩn .
$ go build main.go
$ ls -lh
-rwxr-xr-x-x 1 nil nil 1.8M Oct 27 07:47 main
Hãy biên dịch lại một lần nữa với go build
nhưng với ldflags
như đã đề xuất ở trên,
$ go build -ldflags "-s -w" main.go
$ ls -lh
-rwxr-xr-x-x 1 nil nil 1.2M Oct 27 08:15 main
Kích thước tệp giảm 30%.
Bây giờ, hãy sử dụng gccgo
,
$ go version
go version go1.8.1 gccgo (GCC) 7.2.0 linux/amd64
Tòa nhà đi cùng gccgo
,
$ go build main.go
$ ls -lh
-rwxr-xr-x 1 nil nil 34K Oct 27 12:18 main
Kích thước nhị phân giảm gần như 100%. Chúng ta hãy một lần nữa cố gắng xây dựng của chúng tôi main.go
với gccgo
nhưng với xây dựng cờ,
$ go build -gccgoflags "-s -w" main.go
-rwxr-xr-x 1 nil nil 23K Oct 27 13:02 main
Cảnh báo:
Vì các gccgo
tệp nhị phân được liên kết động. Nếu bạn có một tệp nhị phân có kích thước rất lớn, tệp nhị phân của bạn khi được biên dịch bằng gccgo sẽ không bị giảm 100%, nhưng nó sẽ bị giảm kích thước đáng kể.
So với gc, gccgo biên dịch mã chậm hơn nhưng hỗ trợ tối ưu hóa mạnh mẽ hơn, do đó, chương trình ràng buộc CPU do gccgo xây dựng thường sẽ chạy nhanh hơn. Tất cả các tối ưu hóa được triển khai trong GCC qua nhiều năm đều có sẵn, bao gồm tối ưu hóa nội tuyến, tối ưu hóa vòng lặp, vectơ hóa, lập lịch hướng dẫn, v.v. Mặc dù không phải lúc nào nó cũng tạo ra mã tốt hơn, nhưng trong một số trường hợp, các chương trình được biên dịch bằng gccgo có thể chạy nhanh hơn 30%.
Các bản phát hành GCC 7 dự kiến sẽ bao gồm việc triển khai hoàn chỉnh các thư viện người dùng Go 1.8. Giống như các bản phát hành trước đó, thời gian chạy Go 1.8 không được hợp nhất hoàn toàn, nhưng điều đó sẽ không hiển thị với các chương trình Go.
Ưu điểm:
- Giảm kích thước
- Tối ưu hóa.
Nhược điểm
- Chậm
- Không thể sử dụng phiên bản mới nhất của
go
.
Bạn có thể xem ở đây và ở đây .