使用背景

项目使用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位系统支持很差。