Go死码消除

简介: Go死码消除

概念:


死码消除(dead code elimination, DCE) 是一种编译器优化技术, 作用是在编译阶段去掉对程序运行结果没有任何影响的代码

逃逸分析,内联优化并称为 Go编译器执行的三个重要优化




效果:


对于 const.go代码如下:

package main
import "fmt"
func max(a, b int) int {
  if a > b {
    return a
  }
  return b
}
const a, b = 10, 20
func main() {
  if max(a, b) == a {
    fmt.Println(a)
  }
}

对于var.go代码如下:

package main
import "fmt"
func max2(x, y int) int {
  if x > y {
    return x
  }
  return y
}
var x, y = 10, 20
func main() {
  if max2(x, y) == x {
    fmt.Println(x)
  }
}

两个文件的差异,只在于 两个参数 是变量还是常量


分别编译 const.govar.go, 生成的二进制文件大小如下:

go build -o 想要生成的二进制名称 想要编译的.go文件

微信截图_20230925191020.png

不难发现, constvar 体积小了约 10%


为何如此?


首先编译器会对max函数进行内联优化, const.go 优化后如下:

package main
import "fmt"
const a, b = 10, 20
func main() {
  var result int
  if a > b {
    result = a
  } else {
    result = b
  }
  if result == a {
    fmt.Println(a)
  }
}

微信截图_20230925191059.png

因为 ab是常量, 永远有a<b, 编译器可以在编译时证明该分支永远不会为true, 因此编译器可以进一步优化代码为:

微信截图_20230925191112.png

if a > b {}这个分支被消除了,这称为分支消除


又知道结果总是等于b,因此编译器还将进一步将代码优化为:

package main
const a, b = 10, 20
func main() {
  const result = b
}

最后就是:

package main
func main() {
}

而对于var.go, 参数为 全局变量 不为常量,编译器并不知道运行过程中x、y会不会发生改变, 因此不能进行死代码消除.

这部分代码被编译到最终的二进制程序中, 造成 二进制文件 varconst 体积大了约 10%


分支消除是死码消除一种. 使用静态证明来表明一段代码永远不可达,通常会被称为死代码,它不需要在最终的二进制文件中编译和优化.

编译器在编译阶段, 死码消除与内联优化一起工作, 可以减少循环和分支产生的代码数量


目录
相关文章
|
6月前
|
缓存 测试技术 Go
使用Singleflight优化Go代码
使用Singleflight优化Go代码
|
6月前
|
存储 Unix 测试技术
解释Go中常见的I/O模式
解释Go中常见的I/O模式
|
6月前
|
Kubernetes 数据可视化 Java
|
存储 Go
Go学习笔记-Go 浮点数设计原理
Go学习笔记-Go 浮点数设计原理
135 0
|
JSON Go 数据格式
Go方法特性详解:简单性和高效性的充分体现1
Go方法特性详解:简单性和高效性的充分体现
67 0
|
设计模式 算法 编译器
Go方法特性详解:简单性和高效性的充分体现2
Go方法特性详解:简单性和高效性的充分体现
76 0
|
安全 测试技术 Go
Go1.18 正式发布,揭秘三大特性
Go1.18 正式发布,揭秘三大特性
|
Go 开发者
[Go开源工具] go-optioner:轻松生成函数选项模式代码
你是否使用过 functional options 函数选项模式?在使用时,你是否遇到过多字段的结构体而需要手动编写大量的设置选项函数的代码? 本文介绍了 go-opioner 开源工具的安装和使用,它能够根据结构体的定义,自动生成函数选项模式的代码。
158 0
|
3月前
|
SQL 监控 算法
为Go应用无侵入地添加任意代码
这篇文章旨在提供技术深度和实践指南,帮助开发者理解并应用这项创新技术来提高Golang应用的监控与服务治理能力。在接下来的部分,我们将通过一些实际案例,进一步展示如何在不同场景中应用这项技术,提供更多实践启示。

热门文章

最新文章