Go语言性能优化:预分配Slice容量的重要性

简介: Go语言性能优化:预分配Slice容量的重要性

Go语言性能优化:预分配Slice容量的重要性

在Go语言开发中,slice是我们最常用的数据结构之一,但很多开发者常常忽略了一个关键的优化点:预分配容量

问题重现

假设我们需要将一批数据转换后存入slice,常见的写法是这样的:

func badConvert(inputs []int) []int {
   
    result := []int{
   }
    for _, v := range inputs {
   
        result = append(result, v*2)
    }
    return result
}

这段代码看起来简洁,但背后隐藏着性能问题。当result的容量不足时,append会触发底层数组的重新分配和复制,随着数据量增长,这种扩容操作会越来越频繁。

优化方案

如果我们预先知道最终数据的长度,可以这样优化:

func goodConvert(inputs []int) []int {
   
    result := make([]int, 0, len(inputs))
    for _, v := range inputs {
   
        result = append(result, v*2)
    }
    return result
}

性能对比

使用100万个元素的测试数据:

  • 未预分配:约 23ms,发生 18次 扩容
  • 预分配后:约 8ms0次 扩容

性能提升接近 3倍

最佳实践

  1. 能预估长度就预分配 - 使用make([]T, 0, cap)
  2. 无法精确预估时,估算一个合理的初始容量
  3. 注意:预分配过大也会造成内存浪费

这个小技巧在实际项目中对性能的影响非常显著,尤其是处理大量数据时。记住:容量规划,事半功倍!


你是否也有过因为忽略预分配而踩坑的经历?欢迎在评论区分享你的优化故事~

目录
相关文章
|
27天前
|
存储 Java 测试技术
解密 Go 并发:如何用 `sync.Pool` 提升性能
解密 Go 并发:如何用 `sync.Pool` 提升性能
88 0
|
10月前
|
存储 JSON 安全
Go语言切片,使用技巧与避坑指南
Go语言中的切片(Slice)是动态引用数组的高效数据结构,支持扩容与截取。本文从切片基础、常用操作到高级技巧全面解析,涵盖创建方式、`append`扩容机制、共享陷阱及安全复制等内容。通过代码示例详解切片特性,如预分配优化性能、区分`nil`与空切片、处理多维切片等。掌握这些核心知识点,可编写更高效的Go代码。
394 2
|
JSON 移动开发 JavaScript
多款顶级好用的 Vue 表单设计器测评推荐,可拖拽生成表单
Vue 前端开发中,表单组件是排在前三的高频使用的组件,如何快速构建表单,节省力气,避免重复造轮子呢,选择一款适合自己的前端表单设计器就非常重要了。本文介绍 4 款顶级好用的 Vue 表单设计器,其中最后一款卡拉云,是新一代低代码开发工具,不仅能自动生成各类表单,还可以拖拽生成其他常见的前端组件,一行代码连接前后端数据,可快速接入数据库/api。它是表单设计器的超集,可直接生成属于你的后台管理工具,无敌好用。
4450 0
多款顶级好用的 Vue 表单设计器测评推荐,可拖拽生成表单
|
安全
ctfshow-WEB-web4
tf.show WEB模块第4关是一个文件包含漏洞,页面提示了源码中的关键代码,使用include()函数接收url参数,include()函数包含的文件会被执行,从而造成任意代码执行,或者配合伪协议获取敏感文件甚至getshell; 然而这一关伪协议不起作用,我们可以通过日志注入进行任意命令执行,从而getshell
568 0
ctfshow-WEB-web4
|
Android开发 开发工具 git
Android USB转串口通信
一、引用 1、Git上最火的USB转串口通信 2、Android之USB转串口通信 3、安卓开发中的USB转串口通讯 二、截图 废话不多说,先上图,micro usb -> usb 连接的测试温度的外设(其实是个测试粮油品质的,还有TPM值等等) usb_connect.png 三、流程 1、mainfest中注册监听USB拔插动作并且过滤对应vid,pid的设备。
5221 0
|
Windows
无法保存对hosts权限所作的更改 拒绝访问(权限,防止Windows主机文件、进程、注册表项进行操作和更改)
为Windows安装或修改配置、 无法保存对hosts权限所作的更改 拒绝访问 (权限,防止Windows主机文件、进程、注册表项进行操作和更改) 例如,下图: 1.使用Windows的“管理员权限”进行操作 或给当前的Windows用户分配此文件的写权限: 2.如果为文件的修改,可以先创建和复制文件副本其他地方,修改后覆盖 3.计算机安装的杀毒软件和管理软件,控制了
10023 1
|
运维 供应链 前端开发
云HIS医院信息化管理平台源码,SaaS模式、springboot框架
云HIS医院信息化管理平台源码,SaaS模式、springboot框架
497 1
|
JavaScript 小程序 前端开发
【微信小程序】-- WXS 脚本(二十九)
【微信小程序】-- WXS 脚本(二十九)
|
安全 算法 API
现代密码学 考点汇总(下)
现代密码学 考点汇总(下)
564 0

热门文章

最新文章

下一篇
开通oss服务