字节跳动青训营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 负担。


目录
相关文章
|
4月前
|
JSON 自然语言处理 网络协议
【字节跳动青训营】后端笔记整理-2 | Go实践记录:猜谜游戏,在线词典,Socks5代理服务器
猜数字游戏也算是入门一门编程语言必写的程序了。通过这个程序,我们可以熟悉Go语言中的输入输出、流程控制与随机函数的调用。
67 2
|
4月前
|
存储 关系型数据库 MySQL
|
4月前
|
Java 编译器 Go
【字节跳动青训营】后端笔记整理-1 | Go语言入门指南:基础语法和常用特性解析(一)
本文主要梳理自第六届字节跳动青训营(后端组)-Go语言原理与实践第一节(王克纯老师主讲)。
82 1
|
4月前
|
存储 JSON Java
【字节跳动青训营】后端笔记整理-1 | Go语言入门指南:基础语法和常用特性解析(三)
在 Go 语言里,符合语言习惯的做法是使用一个单独的返回值来传递错误信息。
51 0
|
4月前
|
存储 Go C++
【字节跳动青训营】后端笔记整理-1 | Go语言入门指南:基础语法和常用特性解析(二)
Go 语言中的复合数据类型包括数组、切片(slice)、映射(map)和结构体(struct)。
60 0
|
9天前
|
程序员 Go PHP
为什么大部分的 PHP 程序员转不了 Go 语言?
【9月更文挑战第8天】大部分 PHP 程序员难以转向 Go 语言,主要因为:一、编程习惯与思维方式差异,如语法风格和编程范式;二、学习成本高,需掌握新知识体系且面临项目压力;三、职业发展考量,现有技能价值及市场需求不确定性。学习新语言虽有挑战,但对拓宽职业道路至关重要。
38 10
|
7天前
|
Go API 开发者
深入探讨:使用Go语言构建高性能RESTful API服务
在本文中,我们将探索Go语言在构建高效、可靠的RESTful API服务中的独特优势。通过实际案例分析,我们将展示Go如何通过其并发模型、简洁的语法和内置的http包,成为现代后端服务开发的有力工具。
|
9天前
|
算法 程序员 Go
PHP 程序员学会了 Go 语言就能唬住面试官吗?
【9月更文挑战第8天】学会Go语言可提升PHP程序员的面试印象,但不足以 solely “唬住” 面试官。学习新语言能展现学习能力、拓宽技术视野,并增加就业机会。然而,实际项目经验、深入理解语言特性和综合能力更为关键。全面展示这些方面才能真正提升面试成功率。
31 10
|
9天前
|
编译器 Go
go语言学习记录(关于一些奇怪的疑问)有别于其他编程语言
本文探讨了Go语言中的常量概念,特别是特殊常量iota的使用方法及其自动递增特性。同时,文中还提到了在声明常量时,后续常量可沿用前一个值的特点,以及在遍历map时可能遇到的非顺序打印问题。
|
6天前
|
存储 监控 数据可视化
Go 语言打造公司监控电脑的思路
在现代企业管理中,监控公司电脑系统对保障信息安全和提升工作效率至关重要。Go 语言凭借其高效性和简洁性,成为构建监控系统的理想选择。本文介绍了使用 Go 语言监控系统资源(如 CPU、内存)和网络活动的方法,并探讨了整合监控数据、设置告警机制及构建可视化界面的策略,以满足企业需求。
23 1