当前位置: 首页 > news >正文

golang入门笔记——内存管理和编译器优化

在这里插入图片描述

静态分析

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

控制流(control flow):程序的执行流程

数据流(data flow):数据在控制流上的传递

通过分析控制流和数据流,我们可以知道更多关于程序的性质

根据这些性质优化代码

过程内分析和过程间分析

过程内分析:仅在函数内部进行分析

过程间分析:考虑函数调用时参数传递和返回值的数据流和控制流

为什么过程间分析是个问题?

需要通过数据流分析得知i的具体类型,才能知道i.foo()调用的是哪个foo()
根据i的具体类型,产生了新的控制流,i.foo(),分析继续
过程间分析需要同时分析控制流和数据流——联合求解,比较复杂

在这里插入图片描述

Go编译器优化

为什么做编译器优化?

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

现状:

采用的优化少
编译时间较短,没有进行较复杂的代码分析和优化

编译优化的思路:

场景:面向后端长期执行任务
Tradeoff:用编译时间换取更高效的机器码

Beast mode:

函数内联
逃逸分析
默认栈大小调整
边界检查消除
循环展开
……

函数内联

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

优点:

消除函数调用开销,例如传递参数、保存寄存器等
将过程间分析转化为过程内分析,帮助其他优化,例如逃逸分析

缺点:

函数体变大,instruction cache(icache)不友好
编译生成的Go镜像变大

函数内联在大多数情况下是正向优化

内联策略:

调用和被调函数的规模

函数内联能多大程度影响性能?

使用micro-benchmark验证一下

Beast Mode

Go函数内联受到的限制较多

语言特性,例如interface,defer等,限制了函数内联
内联策略非常保守

Beast mode:调整函数内联的策略,使更多函数被内联

降低函数调用的开销
增加了其他优化的机会:逃逸分析

开销
Go镜像增加~10%
编译时间增加

逃逸分析

逃逸分析:分析代码中指针的动态作用域:指针在何处可以被访问

大致思路:

从对象分配处出发,沿着控制流,观察对象的数据流
若发现指针p在当前作用域s:作为参数传递给其他函数传递给全局变量传递给其他的goroutine传递给已逃逸的指针指向的对象
则指针p指向的对象逃逸出s,反之则没有逃逸出s

Beast mode:函数内联扩展了函数边界,更多对象不逃逸

优化:未逃逸的对象可以在栈上分配

	对象在栈上分配和回收很快:移动sp减少在heap上的分配,降低GC负担
http://www.lryc.cn/news/12967.html

相关文章:

  • GEE学习笔记 七十:【GEE之Python版教程四】Python基础编程二
  • 股票投资新出发之知识体系构建导论
  • 蓝桥杯算法训练合集 十六 1.首字母变大写2.盾神计科导作业3.Cinema4.接水问题
  • 密码的世界
  • 如何用一句话感动测试工程师?产品和技术都这么说!
  • 3|物联网控制|计算机控制-刘川来胡乃平版|第2章:计算机控制系统中的检测设备和执行机构-2.1传感器和变送器|课堂笔记|ppt
  • MySQL中使用索引优化
  • Linux C/C++ 多线程TCP/UDP服务器 (监控系统状态)
  • 【JavaScript】JavaScript基本使用方法
  • Python数据容器、list列表、tuple元组、str字符串、数据容器(序列)切片、set集合、dict字典、字符串大小比较
  • Python urllib
  • Centos7安装Python3
  • [U3D ShaderGraph] 全面学习ShaderGraph节点 | 第四课 | Input/Lighting
  • SpringBoot升级到3.0
  • JavaWeb8-线程安全问题
  • 进程切换-
  • python--matplotlib(2)
  • 【李忍考研传】五、信心
  • Web 页面之间传递参数的几种方法
  • Android实例仿真之二
  • day47【代码随想录】动态规划之买卖股票的最佳时机III、买卖股票的最佳时机IV、最佳买卖股票时机含冷冻期、买卖股票的最佳时机含手续费
  • 网络数据包接收流程
  • CSAPP学习笔记——虚拟内存(二)
  • 面试sql
  • Python编程自动化办公案例(2)
  • Vulnhub 渗透练习(七)—— FRISTILEAKS: 1.3
  • 阶段二10_面向对象高级_分类分包思想和案例环境搭建
  • 关于打印工具print-js的使用
  • Doxygen使用
  • MySQL数据库调优————表结构设计优化