jinzh notes
jinzh notes

go性能优化——减小编译后的体积

go性能优化——减小编译后的体积
内容纲要

前言

在说这些之前,现来进行一个有效的对比,Go和C都编译一个非常熟悉并且简单的东西——“hello,world!”

  • Gcc version: 11.2.0
  • Go version: 1.17.6
//C hello,world!
#include<stdio.h>
int main(){
    printf("Hello world!");
}
//Go hello,world!
package main
import "fmt"
func main(){
    fmt.Printf("Hello world!")
}

C和Go编译出来的可执行二进制文件分别为:251K, 1.85M
em…..😅😅
好吧,这大概也许。。。。居然大了这么多

编译参数

Go 编译器默认编译出来的程序会带有符号表和调试信息,一般来说 release 版本可以去除调试信息以减小二进制体积。

go build -ldflags="-s -w"

#-ldflags 'flag list'
#    '-s -w': 压缩编译后的体积
#    -s: 去掉符号表
#    -w: 去掉调试信息,不能gdb调试了

现在,来实际测试一下,在进行构建目标程序时添加以上参数试试:
在进行构建后得到的目标程序大小为:1.28M

效果还是挺明显的,1.85M–>1.28M,体积变为原来的70%左右

UPX

UPX is an advanced executable file compressor. UPX will typically reduce the file size of programs and DLLs by around 50%-70%, thus reducing disk space, network load times, download times and other distribution and storage costs.

upx的压缩属于是加壳压缩,安装方法有很多,这里采用scoop安装

upx压缩命令很简单:

upx -num target
#num是压缩级别,分为1-9个级别
#target是目标文件
upx -9 hello.exe

运行命令压缩后,大小为:499K,这是在添加编译参数后的压缩结果,压缩效率还是很给力的,1.28M–>499K

再来测试一下直接压缩效果如何,1.85M–>1.02M,压缩为原文件的55%,也不错

总结

在实际生产过程中,采取release版本剔除调试信息和符号表,在通过UPX进行一遍压缩,压缩效果大概能减少30%左右的体积

影翼

文章作者

发表回复

textsms
account_circle
email

jinzh notes

go性能优化——减小编译后的体积
前言 在说这些之前,现来进行一个有效的对比,Go和C都编译一个非常熟悉并且简单的东西——“hello,world!” Gcc version: 11.2.0 Go version: 1.17.6 //C hello,world! #include<stdio.…
扫描二维码继续阅读
2022-01-17