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

news2024/9/23 3:19:57

在这里插入图片描述

静态分析

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

控制流(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.coloradmin.cn/o/357194.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络安全应急响应服务方案怎么写?包含哪些阶段?一文带你了解!

文章目录一、服务范围及流程1.1 服务范围1.2 服务流程及内容二、准备阶段2.1 负责人准备内容2.2 技术人员准备内容(一)服务需求界定(二)主机和网络设备安全初始化快照和备份2.3市场人员准备内容(1)预防和预…

全网最新的软件测试/自动化测试必问的面试题合集

1.你为什么选择软件测试行业因为之前有了解软件测试这个行业,觉得他的发展前景很好。2.根据你以前的工作经验描述一下软件开发、测试过程,由那些角色负责,你做什么要有架构师、开发经理、测试经理、程序员、测试员。我在里面主要是负责所分到…

曙光超算平台 如何使用 Tensorboard (乌镇中心)

在E-Shell中执行 1. salloc -p 队列名 -N 1 -n 32 --gresdcu:4 salloc -p wzhdtest -N 1 -n 32 --gresdcu:4 2. ssh 节点名 ssh g01r3n07 3. conda deactivate 4. 查看当前所有模块 module ava compiler 从上图中加载某个dtk模块 module load compiler/dtk/21.10 注&…

第九章 vue 进阶篇 Element Plus 基本使用

Element Plus 基本使用 element-ui 是基于vue 开发的一套ui组件库,提供丰富的网页开发组件,可用快速开发网站,降低前端开发成本 版本 element目前有两个版本 element-ui:基于vue2 element-plus: 基于vue3官网地址 https://elem…

JVM知识体系学习七:了解JVM常用命令行参数、GC日志详解、调优三大方面(JVM规划和预调优、优化JVM环境、JVM运行出现的各种问题)

文章目录前言一、了解JVM常用命令行参数1、命令行参数概述2、常用命令3、通过案例学命令行参数(Linux)4、区分概念二、GC日志详解1、打印详细日志2、日志描述3、解析案例三、调优前的基础概念四、调优是什么?1、调优1:JVM规划和预调优a、涨知识时刻b、概…

解決 torch 無法使用GPU

1.使用 import torch torch.cuda.is_available() ------> False print(torch.version) --> 查詢 torch 版本 2.命令行,輸入 nvidia-smi 3.直接去網站找出相對應版本 https://download.pytorch.org/whl/torch_stable.html cuda : 11.7 -> cu117 python3.…

分享95个HTML娱乐休闲模板,总有一款适合您

分享95个HTML娱乐休闲模板,总有一款适合您 95个HTML娱乐休闲模板下载链接:https://pan.baidu.com/s/1nBCV2kTy1csY3z8QRqXrsQ?pwd946p 提取码:946p Python采集代码下载链接:采集代码.zip - 蓝奏云 夜店娱乐网站模板 游戏模板…

mybatis条件构造器(二)

mybatis条件构造器(二) 1 准备工作 1.1 建表sql语句(Emp表) SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS 0;-- ---------------------------- -- Table structure for emp -- ---------------------------- DROP TABLE IF EXISTS emp; CREATE TABLE emp (EMPNO int NOT NU…

2023年安徽省职业院校“磐云杯”网络安全竞赛任务书

2023年安徽省职业院校“磐云杯”网络安全竞赛 任务书 一、竞赛时间 总计:360分钟 三、竞赛任务书内容 (一)拓扑图 (二)A模块基础设施设置/安全加固(200分) 一、项目和任务描述:…

UML-时序图以及PlantUML绘制

介绍 时序图(Sequence Diagram),又名序列图、循序图,是一种UML交互图。它通过描述对象之间发送消息的时间顺序显示多个对象之间的动态协作。它可以表示用例的行为顺序,当执行一个用例行为时,其中的每条消息…

Python基础4——面向对象

目录 1. 认识对象 2. 成员方法 2.1 成员方法的定义语法 3. 构造方法 4. 其他的一些内置方法 4.1 __str__字符串方法 4.2 __lt__小于符号比较方法 4.3 __le__小于等于符号比较方法 4.4 __eq__等号比较方法 5. 封装特性 6. 继承特性 6.1 单继承 6.2 多继承 6.3 pas…

MySQL数据库调优————ORDER BY语句

ORDER BY调优的核心原理,原则是利用索引的有序性跳过排序环节 关于ORDER BY语句的一些尝试 我们使用employees表进行尝试,索引情况如下 在执行计划的结果中,Extra里如果存在,Using filesort则表示,排序没有使用到索…

JavaScript 代码规范

文章目录JavaScript 代码规范JavaScript 代码规范变量名空格与运算符代码缩进语句规则对象规则每行代码字符小于 80命名规则HTML 载入外部 JavaScript 文件使用 JavaScript 访问 HTML 元素文件扩展名使用小写文件名JavaScript 代码规范 所有的 JavaScript 项目适用同一种规范。…

PADS设计基础

目录 1 PADS设计流程简介 2 快捷键 2.1鼠标指令 2.2快捷键 3元件库概述 3.1元件库分类 3.2创建元件库 3.3新的元件类型的创建 3.3.1 插座的创建 1 PADS设计流程简介 常规PADS设计流程:设计启动→建库→原理图设计→网表调入→布局→布线→验证优化→设计资料输出→加…

VUE3源码分析————rollup打包遇见问题

文章目录一、require无法使用二、The requested module xxx does not provide an export named default三、__filename无法使用四、path.resolve() arguments must be a string一、require无法使用 在使用rullup打包的过程中,我们需要在最外层的package.json文件中…

时间序列分解法

影响时间序列变化的因素通常由长期趋势,季节变动,周期变动,不规则变动几部分组成 长期趋势指现象在较长时期内持续发展变化的一种趋向或状态。季节变动是由于季节的变化引起的现象发展水平的规则变动(波动长度固定)周…

n阶数字回转方阵 ← 模拟法

【问题描述】 请编程输出如下数字回旋方阵。 【算法代码】 #include <bits/stdc.h> using namespace std;const int maxn100; int z[maxn][maxn];void matrix(int n) {int num2;z[0][0]1;int i0,j1;while(i<n && j<n) {while(i<j) z[i][j]num;while(j&…

Redis底层原理(持久化+分布式锁)

Redis底层原理 持久化 Redis虽然是个内存数据库&#xff0c;但是Redis支持RDB和AOF &#xff08;Redis Database Backup file&#xff08;Redis数据备份文件&#xff09;&#xff0c;也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中 &#xff1b;Appen…

基于粒子群优化算法的电动汽车充放电V2G研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

CMMI-质量保证

质量保证&#xff08;Quality Assurance, QA&#xff09;的目的是提供一种有效的人员组织形式和管理方法&#xff0c;通过客观地检查和监控“过程质量”与“产品质量”&#xff0c;从而实现持续地改进质量。质量保证是一种有计划的、贯穿于整个产品生命周期的质量管理方法。质量…