【青训营】Go的一些性能优化技巧
一、Slice切片的性能优化
对Slice进行内存预分配
尽可能在使用make()初始化函数的时候提供容量信息,因为切片本质是一个数组片段的描述,其源码如下:
type slice struct{array unsafe.Pointerlen int// 长度cap int// 容量
}
如果没有指定容量,那么可能会使得slice进行扩容操作,扩容操作会耗费额外时间。因此最好在初始化时指定好容量
大内存释放陷阱
我试图组织语言结果发现自己说不明白,还是直接看别人的吧
https://blog.csdn.net/QiuHaoqian/article/details/108996719
也就是要对切片进行切片的话,最好使用copy函数吧
二、Map的性能优化
Map的预分配内存
// 无预分配内存
func NoPreAlloc(size int){data := make(map[int]int)for i:=0; i<size; i++{data[i]=1}
}// 带预分配内存
func PreAlloc(size int) {data := make(map[int]int, size)for i := 0; i < size; i++ {data[i] = 1}
}
无预分配内存的话也会导致go对map进行扩容操作,这些操作十分耗费时间,并且需要数次请求内存分配。提前分配好空间你可以减少内存拷贝和rehash消耗
三、字符串的处理
使用strings.Builder拼接字符串
字符串拼接是十分敞开的呢操作,但是使用常规的str=str1+str2的性能十分堪忧。可以使用strings.Builder进行优化。使用案例如下:
func StrBuilder(n int, str string) string {var builder strings.Builderfor i := 0; i < n; i++ {builder.WriteString(str)}return builder.String()
}
其原因在于,字符串在Go语言中是不可变类型,其占用内存大小是固定的,而使用+每次都需要重新分配内存。strings.Builder和bytes.Buffer底层都是[]byte数组,因此不需要每次拼接都重新分配内存。而bytes.Buffer将素组转化为字符串的时候新申请了一片空间,而strings.Builder则是直接将数组转化为字符串返回,因此strings.Builder性能会更优秀一些。
性能差异如下
其中第一个是直接使用+连接字符串,其开销是十分大的的
第二个是StrBuilder,其效率是最高的
如果在使用时已经知道了字符串的长度,那么也可以对字符串变量进行预分配,此时效率是最高的。
func PreStrBuilder(n int, str string) string {var builder strings.Builderbuilder.Grow(n * len(str)) // 预分配str的内存大小for i := 0; i < n; i++ {builder.WriteString(str) // 将str写进builder}return builder.String()
}
对string进行预分配的关键是Grow()。Grow()方法保证了其内部的 slice 一定能够写入n个字节。只有当 slice 空余空间不足以写入n个字节时,扩容才有可能发生。
小技巧:使用空结构体节省内存
空结构体struct{}实例不占任何内存空间。比如一般会使用map来实现一个Set,但是Set只需要使用到map的键,不需要使用到它的值,因此可以使用以下的方法定义map来节省空间
make(map[int]struct{})
其中map的键是一个空结构体,不占内存空间
四、使用atomic包实现进程管理
atomic包可以实现线程安全、加锁、原子变量和原子操作等。和平常的sync.Mutex相比,mutex的视线是通过操作系统实现,属于系统调用,其开销是比较大的;相比之下,atomic操作是用过硬件实现的,效率较高
【青训营】Go的一些性能优化技巧相关推荐
- 字节青训营第三课之高质量编程与性能调优实战的笔记和总结
这是字节青训营第三课:高质量编程与性能调优实战的笔记和总结 概要 准备 尝试使用 test 命令,编写并运行简单测试 尝试使用 -bench参数,对函数进行性能测试 推荐阅读Go代码Review建议. ...
- 字节青训营抖音APP
You just work hard, the rest is up to time GitHub地址:https://github.com/xiaodainiao/TikTokLite TikTok ...
- 第五届字节跳动青训营(寒假)—— 后端练习题
第五届字节跳动青训营(寒假)-- 后端练习题 Day1 选择题 1.Client 在使用 Https 协议访问网站进行通信的过程中,以下说法正确的是? A. 只用到了对称加密技术 B. 只用到了非对称 ...
- 构建webpack知识体系 | 青训营笔记
这是我参与「第四届青训营 」笔记创作活动的的第4天. 进阶中高级前端工程师,对webpack打包构建工具的掌握是必不可少的.我也曾经看过许多webpack教程,但无非是记记某些模式怎么配置,根本就没有 ...
- 【Go入门】Socks5代理服务器实现 翻译api调用 | 青训营笔记
这是我参与「第三届青训营 -后端场」笔记创作活动的的第一篇笔记. [课程一]Go基础 主要内容 第一节课主要介绍了go的语法基础,包括变量.循环分支.数组切片.函数方法.错误处理.字符串.格式化处理. ...
- 字节青训营第一课之go语言入门的笔记和总结
有幸参加了字节跳动举办的青训营活动,主要是go语言的编程实践,我将会整理课程的笔记和总结,欢迎关注! 1Go语言简介 由于Go语言有语法简单.高性能等特点,因此国内外各大公司如谷歌.腾讯.字节等都在使 ...
- Android基础第六天 | 字节跳动第四届青训营笔记
这是我参与「第四届青训营 」笔记创作活动的的第6天 端智能技术演进与实践 文章目录 端智能技术演进与实践 课程回顾 01 什么是端智能技术 1.1 端智能是什么? 1.2 为什么要做端智能? 1.3 ...
- 字节跳动青训营--前端day7
文章目录 前言 一.Node.js 的应用场景 (why) 1. 前端工程化 2. web服务端应用 3. Electron跨端桌面应用 二.Node.js 运行时结(what) 1. V8 ,lib ...
- HTML+CSS实现按钮手风琴效果 | 青训营笔记
HTML+CSS实现按钮手风琴效果 | 青训营笔记 需求描述 HTML部分 CSS部分 完整代码 效果展示 这是我参与「第四届青训营」笔记创作活动的的第7天. 需求描述 实现一排居中的五个图标,默认为 ...
- EXPER LOG | 作为ByteDance青训营-客户端-项目leader的历程和收获
~此处为记录2022SUMMER青训营,我担任项目组长时,在团队协作,项目任务分配,规则商议协定以及收获心得 ~还在更新中 极简tiktok内容介绍: 榜单模块(主页面一) 榜单页面设计 历史数据查询 ...
最新文章
- 机器学习入门(04)— 神经网络多维数组 NumPy 相乘运算
- 10、 HAVING:过滤分组
- oc知识点 类的扩展
- Swift - 判端网络连接状态,连接类型(3G还是Wifi)
- MySQL for Java的SQL注入测试
- java invoke 返回类型_java-控制器处理程序方法支持的返回类型
- 每天一道算法题(16)——翻转链表
- Linux内核多线程——补充(各种平台下的多线程)
- 网页中常说的‘焦点’是什么意思
- vmware安装或卸载时,显示无法打开注册表项
- unix/linux 系统 进程资源限制参数
- 手动开启/关闭macOS HiDPI,让2k显示器完美适配macOS,解决紫屏问题
- 基于lucene的案例开发:纵横小说章节列表采集
- IntelliJ IDEA java项目导入jar包,打jar包
- 带你科学了解NAD是什么?NAD+是什么东西?
- MPI多进程问题记录
- Excel表格怎么转PDF?这两种途径都可以
- 07- Workbench网格划分概述
- QA的职责和角色定位
- ansible主机清单配置详解
热门文章
- spring框架搭建与入门案例
- 临近年末,外贸业务员如何催单
- mysql命令导出方法_MySQL数据库导出方法大全(命令行+navicat)
- 亚马逊云科技基于智能搜索,为企业打造知识库
- Actipro WPF Studio语法编辑器和停靠控件
- 6n8p+6P3p单端纯二线路胆机
- XSAVE consistency problem, dumping leaves
- 英读廊——学者气?“爱”属于生物学?一个从学术角度对情感之疑
- 举个栗子~Tableau 技巧(242):学做 条形图 和 桑基图 的组合图表
- vue怎么用照片做视频,vue可以直接拍照片吗