一、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的一些性能优化技巧相关推荐

  1. 字节青训营第三课之高质量编程与性能调优实战的笔记和总结

    这是字节青训营第三课:高质量编程与性能调优实战的笔记和总结 概要 准备 尝试使用 test 命令,编写并运行简单测试 尝试使用 -bench参数,对函数进行性能测试 推荐阅读Go代码Review建议. ...

  2. 字节青训营抖音APP

    You just work hard, the rest is up to time GitHub地址:https://github.com/xiaodainiao/TikTokLite TikTok ...

  3. 第五届字节跳动青训营(寒假)—— 后端练习题

    第五届字节跳动青训营(寒假)-- 后端练习题 Day1 选择题 1.Client 在使用 Https 协议访问网站进行通信的过程中,以下说法正确的是? A. 只用到了对称加密技术 B. 只用到了非对称 ...

  4. 构建webpack知识体系 | 青训营笔记

    这是我参与「第四届青训营 」笔记创作活动的的第4天. 进阶中高级前端工程师,对webpack打包构建工具的掌握是必不可少的.我也曾经看过许多webpack教程,但无非是记记某些模式怎么配置,根本就没有 ...

  5. 【Go入门】Socks5代理服务器实现 翻译api调用 | 青训营笔记

    这是我参与「第三届青训营 -后端场」笔记创作活动的的第一篇笔记. [课程一]Go基础 主要内容 第一节课主要介绍了go的语法基础,包括变量.循环分支.数组切片.函数方法.错误处理.字符串.格式化处理. ...

  6. 字节青训营第一课之go语言入门的笔记和总结

    有幸参加了字节跳动举办的青训营活动,主要是go语言的编程实践,我将会整理课程的笔记和总结,欢迎关注! 1Go语言简介 由于Go语言有语法简单.高性能等特点,因此国内外各大公司如谷歌.腾讯.字节等都在使 ...

  7. Android基础第六天 | 字节跳动第四届青训营笔记

    这是我参与「第四届青训营 」笔记创作活动的的第6天 端智能技术演进与实践 文章目录 端智能技术演进与实践 课程回顾 01 什么是端智能技术 1.1 端智能是什么? 1.2 为什么要做端智能? 1.3 ...

  8. 字节跳动青训营--前端day7

    文章目录 前言 一.Node.js 的应用场景 (why) 1. 前端工程化 2. web服务端应用 3. Electron跨端桌面应用 二.Node.js 运行时结(what) 1. V8 ,lib ...

  9. HTML+CSS实现按钮手风琴效果 | 青训营笔记

    HTML+CSS实现按钮手风琴效果 | 青训营笔记 需求描述 HTML部分 CSS部分 完整代码 效果展示 这是我参与「第四届青训营」笔记创作活动的的第7天. 需求描述 实现一排居中的五个图标,默认为 ...

  10. EXPER LOG | 作为ByteDance青训营-客户端-项目leader的历程和收获

    ~此处为记录2022SUMMER青训营,我担任项目组长时,在团队协作,项目任务分配,规则商议协定以及收获心得 ~还在更新中 极简tiktok内容介绍: 榜单模块(主页面一) 榜单页面设计 历史数据查询 ...

最新文章

  1. 机器学习入门(04)— 神经网络多维数组 NumPy 相乘运算
  2. 10、 HAVING:过滤分组
  3. oc知识点 类的扩展
  4. Swift - 判端网络连接状态,连接类型(3G还是Wifi)
  5. MySQL for Java的SQL注入测试
  6. java invoke 返回类型_java-控制器处理程序方法支持的返回类型
  7. 每天一道算法题(16)——翻转链表
  8. Linux内核多线程——补充(各种平台下的多线程)
  9. 网页中常说的‘焦点’是什么意思
  10. vmware安装或卸载时,显示无法打开注册表项
  11. unix/linux 系统 进程资源限制参数
  12. 手动开启/关闭macOS HiDPI,让2k显示器完美适配macOS,解决紫屏问题
  13. 基于lucene的案例开发:纵横小说章节列表采集
  14. IntelliJ IDEA java项目导入jar包,打jar包
  15. 带你科学了解NAD是什么?NAD+是什么东西?
  16. MPI多进程问题记录
  17. Excel表格怎么转PDF?这两种途径都可以
  18. 07- Workbench网格划分概述
  19. QA的职责和角色定位
  20. ansible主机清单配置详解

热门文章

  1. spring框架搭建与入门案例
  2. 临近年末,外贸业务员如何催单
  3. mysql命令导出方法_MySQL数据库导出方法大全(命令行+navicat)
  4. 亚马逊云科技基于智能搜索,为企业打造知识库
  5. Actipro WPF Studio语法编辑器和停靠控件
  6. 6n8p+6P3p单端纯二线路胆机
  7. XSAVE consistency problem, dumping leaves
  8. 英读廊——学者气?“爱”属于生物学?一个从学术角度对情感之疑
  9. 举个栗子~Tableau 技巧(242):学做 条形图 和 桑基图 的组合图表
  10. vue怎么用照片做视频,vue可以直接拍照片吗