使用背景
项目使用golang进行绘图,该绘图程序需要打包成二进制文件,发送到机器上执行,但是公司的低端机器的内存较小.
方法一:更新到最新go版本
用最新的go版本,因为新版的go,肯定是优化了打包速度,打包体积,运行速度等多方面,不管怎么说一定比上一个版本要好
方法二:upx压缩文件
优点
压缩的程序占用更少的硬盘空间
UPX 可以压缩各种类型的可执行文件
压缩后的文件可以直接由操作系统执行
压缩过程不会修改源文件,也就意味着解压后直接可以得到原始文件
不会产生额外的动态库调用
缺点
,但会在打开时消耗更多的 CPU 资源,在运行时占用更多的内存(或 swap 空间、/tmp 存储等)
看起来只是对有磁盘空间有需求的时候有用
方法三:优化打包命令(推荐)
- -s: 去掉符号信息。((这样 panic 时,stack trace 就没有任何文件名/行号信息了,这等价于普通C/C+=程序被strip的效果))
- -w: 去掉DWARF调试信息。
go build -ldflags="-s -w" main.go
方法四:基于GccGo进行编译
什么是GccGo呢?GccGo是gcc专门用来编译Golang语言的。我们平常用go build来编译Golang语言的是GC,全称Golang Compiler,是Go语言官方编译器,也是自带的。两者有什么区别呢?
- GccGo可以生成一个二进制文件,该二进制文件可以动态链接到libgo,这会使输出变小,但意味着要在目标计算机上安装相关的库。没有cgo的二进制文件没有此要求。
- GC是Go语言原生的编译器,不需要安装,使用方便;而GccGo需要自已安装。
- GC只支持一些主流的处理器,如x86、amd、ARM等。而GccGo支持基本上所有的处理器。
- GC编译速度比GccGo快
- GCCGO具有滞后性,并不能支持编译所有的Golang版本,这个在使用时要注意。
- GccGo能生成很好的执行代码,但缺少逃逸检测,会在很多小内存的分配和回收上损失一些性能。
- GC实现的不严谨,对32位系统支持很差。