让比较c和go:Hello_world.c:
#includeint main(){ printf("Hello world!"); }
Hello_world.go:
package main import "fmt" func main(){ fmt.Printf("Hello world!") }
编译两者:
$gcc Hello_world.c -o Hello_c $8g Hello_world.go -o Hello_go.8 $8l Hello_go.8 -o Hello_go
还有,这是什么?
$ls -ls ... 5,4K 2010-10-05 11:09 Hello_c ... 991K 2010-10-05 11:17 Hello_go
关于1Mb你好世界.你在跟我开玩笑吗?我做错了什么?
(剥离Hello_go - >仅限893K)
如果您使用的是基于Unix的系统(例如Linux或Mac OSX),您可以尝试通过使用-w标志构建它来删除可执行文件中包含的调试信息:
go build -ldflags "-w" prog.go
文件大小显着减少.
有关更多详细信息,请访问GDB的页面:http://golang.org/doc/gdb
2016答案:
1.使用Go 1.7
2.编译 go build -ldflags "-s -w"
? ls -lh hello -rwxr-xr-x 1 oneofone oneofone 976K May 26 20:49 hello*
3.然后使用upx
,goupx
自1.6以来不再需要.
? ls -lh hello -rwxr-xr-x 1 oneofone oneofone 367K May 26 20:49 hello*
这个文件更大是一个问题吗?我不知道Go但我会假设它静态地链接了一些运行时库,这不是C程序的情况.但是一旦你的程序变大,可能就没什么可担心的了.
如上所述这里,静态链接Go运行时是默认的.该页面还告诉您如何设置动态链接.
Go二进制文件很大,因为它们是静态链接的(除了使用cgo的库绑定).尝试静态链接C程序,你会发现它增长到相当的大小.
如果这对你来说真的是个问题(我很难相信),你可以用gccgo编译并动态链接.
你应该得到goupx,它将"修复"Golang ELF可执行文件upx
.在某些情况下,我已经有大约78%的文件缩小了~16MB >> ~3MB
.
压缩比通常趋于25%,所以值得一试:
$ go get github.com/pwaller/goupx $ go build -o filename $ goupx filename
>>
2014/12/25 10:10:54 File fixed! File size Ratio Format Name -------------------- ------ ----------- ----------- 16271132 -> 3647116 22.41% linux/ElfAMD filename Packed 1 file.
EXTRA:-s
flag(strip)可以进一步缩小bin文件goupx -s filename
更紧凑的hello-world示例:
package main func main() { print("Hello world!") }
我们喜欢大fmt
包装和显着减少二进制:
$ go build hello.go $ ls -lh hello ... 259K ... hello2 $ strip hello $ ls -lh hello ... 162K ... hello2
不像C那么紧凑,但是用K而不是M来测量:)好吧,这不是一般的方式只是显示一些优化大小的方法:使用strip并尝试使用最小的包.无论如何Go不是制作小尺寸二进制文件的语言.
创建一个名为的文件main.go
,让我们尝试使用简单的hello world程序.
package main import "fmt" func main(){ fmt.Println("Hello World!") }
我使用版本1.9.1
$ go version go version go1.9.1 linux/amd64
使用标准go build
命令编译.
$ go build main.go $ ls -lh -rwxr-xr-x-x 1 nil nil 1.8M Oct 27 07:47 main
让我们再次编译,go build
但ldflags
如上所述,
$ go build -ldflags "-s -w" main.go $ ls -lh -rwxr-xr-x-x 1 nil nil 1.2M Oct 27 08:15 main
文件大小减少了30%.
现在,让我们用gccgo
,
$ go version go version go1.8.1 gccgo (GCC) 7.2.0 linux/amd64
建筑物去gccgo
,
$ go build main.go $ ls -lh -rwxr-xr-x 1 nil nil 34K Oct 27 12:18 main
二进制大小减少了近100%.让我们再次尝试建立我们main.go
与gccgo
而是构建标志,
$ go build -gccgoflags "-s -w" main.go -rwxr-xr-x 1 nil nil 23K Oct 27 13:02 main
警告:
作为gccgo
二进制文件进行动态链接.如果你有一个非常大的二进制文件,那么用gccgo编译时你的二进制文件不会减少100%,但它的大小会减少相当大的数量.
与gc相比,gccgo编译代码的速度较慢,但支持更强大的优化,因此由gccgo构建的CPU绑定程序通常运行得更快.多年来在GCC中实现的所有优化都是可用的,包括内联,循环优化,向量化,指令调度等.虽然它并不总能产生更好的代码,但在某些情况下,使用gccgo编译的程序运行速度可提高30%.
预计GCC 7版本将包括Go 1.8用户库的完整实现.与早期版本一样,Go 1.8运行时未完全合并,但Go程序不应该看到它.
优点:
缩小尺寸
优化.
缺点
慢
无法使用最新版本go
.
你可以在这里和这里看到.