Golang性能优化实践

news/2024/9/30 13:06:01

内存警察

警惕一切隐式内存分配

典型case:

  函数返回了字符串、切片,警惕一切字符串

传进去的输入,函数内部重新分配了一个新的内存返回

对象复用

1.sync.pool

 保证有一个ch大小的对象可用

 假设有cpu核数那么多并发任务,可以保证gc的时候有保底在

 

2.局部cache

sync.pool毕竟加锁,要本地ctx能挂载临时对象集,那肯定比pool效率高

 currAccmulator在for循环之外的一个临时变量

 封装在ctx里面的一个临时变量,跟随ctx整个生命周期销毁

 storage存储,后续还能复用

slice复用

1.len与cap

func TestD(t *testing.T) {ints := make([]int, 0, 6)ints = append(ints, 6, 6, 6, 6, 6, 6)// The clear built-in function clears maps and slices.// For maps, clear deletes all entries, resulting in an empty map.// For slices, clear sets all elements up to the length of the slice
    clear(ints)logger.DEBUG("ints", ints, " cap: ", cap(ints), " len:", len(ints))ints = ints[:0] // len == 0, cap == 6 之前的元素还在logger.DEBUG("ints", ints, " cap: ", cap(ints), " len:", len(ints))ints = append(ints[:0], 1, 2, 3) // 这样就覆盖了原来的元素logger.DEBUG("ints", ints, " cap: ", cap(ints), " len:", len(ints))// recapadditionalItems := 10intsLen := len(ints)if n := intsLen + additionalItems - cap(ints); n > 0 {ints = append(ints[:cap(ints)], make([]int, n)...)}ints = ints[:intsLen]// resizesize := 10if cap(ints) > size {ints = ints[:size]} else {ints = make([]int, size)}
}
=== RUN   TestD
2024/06/13 23:24:27 [DEBUG] ints[0 0 0 0 0 0] cap: 6 len:6 
2024/06/13 23:24:27 [DEBUG] ints[] cap: 6 len:0 2024/06/13 23:24:27 [DEBUG] ints[1 2 3] cap: 6 len:3 

 

2.string与bytes

跨类型复用

1.unsafe

2.arena

生命周期管理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hjln.cn/news/45148.html

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

相关文章

linux+windows跨端md软件选择(未找到)

目的 windows上使用typora当初是通过破解的方式实现的。现在装双系统时想做做笔记,没有一个管理的软件用起来很不方便。 要求正常编辑,没有难以忍受的问题。 目录管理及大纲(基于标题层级) linux+windows双端,且linux端能够读取。 从粘贴图片能够在相应的img目录下创建图片…

Linux Debian安装教程

本教程介绍了如何安装和配置 Linux Debian 操作系统,包括虚拟机创建、开启虚拟化、操作系统安装和SSH远程连接,适用于初学者和有经验的用户。Debian 是一个免费的开源操作系统,是最古老的 Linux 发行版之一,于 1993 年由 Ian Murdock 创建。它采用了自由软件协议,并且由志…

c# 获取年,月,日,时,分,秒,星期几

this.nian.Text = DateTime.Now.Year.ToString(); //获取年 this.yue.Text = DateTime.Now.Month.ToString(); //获取月 this.ri.Text = DateTime.Now.Day.ToString(); //获取日 this.xingqi.Text = DateTime.Now.ToString("dddd"); //获取周几 this.shijian.Text = …

2024-06-13 闲话

2024-06-13 闲话今日最乐

多系统修改默认启动系统,grub

问题 我的电脑装了Windows 和 kUbuntu双系统,但是默认是启动kUbuntu的,作为一个使用了多年windows的普通用户,我更希望默认启动是Windows而不是Linux。因此需要修改顺序。 解决 使用root权限修改/boot/grub/grub.cfg文件。 很多文章里都说windows是4,但是我设置了并没有反应…

php基础语法_面向对象

PHP php代码标记 多种标记来区分php脚本 ASP标记:<% php代码 %> 短标记: 脚本标记: 标准标记(常用): 简写风格: ASP风格:<% php代码 %>注意:简写风格和ASP风格需要在php.ini配置文件中修改以下配置为on,移植性差 short_open_tag = on asp_tags = on<ht…

Linux脚本语言入门.md

0、shell介绍 1)Shell是什么? Shell是一个命令行解释器,它为用户提供一个详Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。 Shell还是一个功能相当强大的编程语言,易编写,易调试,灵活性较强。Shell是解释执行的…

排查Java进程CPU占用高之三板斧

写在前面 线上环境突然出现Java进程CPU占用率持续超过100%的问题,该如何排查并定位呢? 问题一:我们如何知道线上环境的那个服务器(或者哪个Docker容器)出现了CPU持续高的故障了呢? 如果是有比较完善的监控设施,当出现CPU持续高时可以通过发送报警通知的方式告知开发人员…