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