字节跳动青训营Day04 - Go编译器优化

简介: 静态分析:不执行代码,推导程序的行为,分析程序的性质。控制流:程序的执行流程数据流:数据在控制流上的传递

1.编译器和静态分析


编译器的结构



静态分析:不执行代码,推导程序的行为,分析程序的性质。

控制流:程序的执行流程

数据流:数据在控制流上的传递



上图的程序转换成控制流图 (control-flow graph)



通过分析控制流和数据流,我们可以知道更多关于程序的性质(properties) ,这些事实可以帮助我们做编译优化。

例如上面的程序。我们通过分析数据流和控制流,知道这个程序始终返回 4。编译器可以根据这个结果做出优化。



Intra-procedural analysis: 函数内分析:在函数内进行控制流和数据流的分析

Inter-procedural analysis: 函数间分析:除了函数内的分析,还需要考虑跨函数的数据流和控制流,例如参数传递,函数返回值等


2.Go 编译器优化


目的


用户无感知,重新编译即可获得性能收益

通用的优化手段


现状


采用的优化较少

追求编译时间短,因此没有进行复杂的代码分析和优化


思路


面向后端长期执行的任务

用适当增加编译时间换取更高性能的代码


函数内联


定义:


将被调用函数的函数体的副本替换到调用位置上,同时重写代码以反映参数的绑定


优点:


消除调用开销

将过程间分析的问题转换为过程内分析,帮助其他分析


缺点:


函数体变大

编译生成的 Go 镜像文件变大


函数内联在大多数情况下是正向优化,即多内联,会提升性能


采取一定的策略决定是否内联


调用和被调用函数的规模

Go 内联的限制


语言特性:interface, defer 等等,限制了内联优化

内联策略非常保守

字节跳动的优化方案


修改了内联策略,让更多函数被内联

增加了其他优化的机会:逃逸分析

开销


Go 镜像大小略有增加

编译时间增加

运行时栈扩展开销增加


逃逸分析


定义:分析代码中指针的动态作用域,即指针在何处可以被访问


大致思路:


从对象分配处出发,沿着控制流,观察数据流。若发现指针 p 在当前作用域 s:


作为参数传递给其他函数;

传递给全局变量;

传递给其他的 goroutine;

传递给已逃逸的指针指向的对象;

优化:未逃逸出当前函数的指针指向的对象可以在栈上分配


对象在栈上分配和回收很快:移动 sp 即可完成内存的分配和回收;

减少在堆上分配对象,降低 GC 负担。


目录
相关文章
|
8月前
|
JSON 自然语言处理 网络协议
【字节跳动青训营】后端笔记整理-2 | Go实践记录:猜谜游戏,在线词典,Socks5代理服务器
猜数字游戏也算是入门一门编程语言必写的程序了。通过这个程序,我们可以熟悉Go语言中的输入输出、流程控制与随机函数的调用。
103 2
|
8月前
|
存储 关系型数据库 MySQL
|
8月前
|
Java 编译器 Go
【字节跳动青训营】后端笔记整理-1 | Go语言入门指南:基础语法和常用特性解析(一)
本文主要梳理自第六届字节跳动青训营(后端组)-Go语言原理与实践第一节(王克纯老师主讲)。
207 1
|
8月前
|
存储 JSON Java
【字节跳动青训营】后端笔记整理-1 | Go语言入门指南:基础语法和常用特性解析(三)
在 Go 语言里,符合语言习惯的做法是使用一个单独的返回值来传递错误信息。
104 0
|
8月前
|
存储 Go C++
【字节跳动青训营】后端笔记整理-1 | Go语言入门指南:基础语法和常用特性解析(二)
Go 语言中的复合数据类型包括数组、切片(slice)、映射(map)和结构体(struct)。
84 0
|
9天前
|
存储 监控 算法
员工上网行为监控中的Go语言算法:布隆过滤器的应用
在信息化高速发展的时代,企业上网行为监管至关重要。布隆过滤器作为一种高效、节省空间的概率性数据结构,适用于大规模URL查询与匹配,是实现精准上网行为管理的理想选择。本文探讨了布隆过滤器的原理及其优缺点,并展示了如何使用Go语言实现该算法,以提升企业网络管理效率和安全性。尽管存在误报等局限性,但合理配置下,布隆过滤器为企业提供了经济有效的解决方案。
46 8
员工上网行为监控中的Go语言算法:布隆过滤器的应用
|
29天前
|
存储 Go 索引
go语言中数组和切片
go语言中数组和切片
40 7
|
29天前
|
Go 开发工具
百炼-千问模型通过openai接口构建assistant 等 go语言
由于阿里百炼平台通义千问大模型没有完善的go语言兼容openapi示例,并且官方答复assistant是不兼容openapi sdk的。 实际使用中发现是能够支持的,所以自己写了一个demo test示例,给大家做一个参考。
|
29天前
|
程序员 Go
go语言中结构体(Struct)
go语言中结构体(Struct)
102 71
|
28天前
|
存储 Go 索引
go语言中的数组(Array)
go语言中的数组(Array)
106 67