golang slice性能分析

golang在gc这块的做得比较弱,频繁地申请和释放内存会消耗很多的资源。另外slice使用数组实现,有一个容量和长度的问题,当slice的容量用完再继续添加元素时需要扩容,而这个扩容会把申请新的空间,把老的内容复制到新的空间,这是一个非常耗时的操作。有两种方式可以减少这个问题带来的性能开销:

  1. 在slice初始化的时候设置capacity(但更多的时候我们可能并不知道capacity的大小)
  2. 复用slice

下面就针对这两个优化设计了如下的benchmark,代码在: https://github.com/hatlonely/hellogolang/blob/master/internal/buildin/slice_test.go

  1. BenchmarkAppendWithoutCapacity-8 100 21442390 ns/op
  2. BenchmarkAppendWithCapLessLen10th-8 100 18579700 ns/op
  3. BenchmarkAppendWithCapLessLen3th-8 100 13867060 ns/op
  4. BenchmarkAppendWithCapEqualLen-8 200 6287940 ns/op
  5. BenchmarkAppendWithCapGreaterLen10th-8 100 18692880 ns/op
  6. BenchmarkAppendWithoutCapacityReuse-8 300 5014320 ns/op
  7. BenchmarkAppendWithCapEqualLenReuse-8 300 4821420 ns/op
  8. BenchmarkAppendWithCapGreaterLen10thReuse-8 300 4903230 ns/op

主要结论:

  1. 在已知 capacity 的情况下,直接设置 capacity 减少内存的重新分配,有效提高性能
  2. capacity < length,capacity越接近length,性能越好
  3. capacity > lenght,如果太大,反而会造成性能下降,这里当capacity > 10 * length时,与不设置capacity的性能差不太多
  4. 多次使用复用同一块内存能有效提高性能

转载请注明出处 
本文链接:http://hatlonely.github.io/2018/01/18/golang slice性能分析/

原文地址:https://www.cnblogs.com/hatlonely/p/8335596.html

时间: 2024-08-12 15:06:27

golang slice性能分析的相关文章

golang pprof 性能分析工具

性能优化是个永恒的话题,而很多时候我们在作性能优化的时候,往往基于代码上面的直觉,把所有能想到的优化都优化了一遍,不错过任何小的优化点,结果整个代码的逻辑变得极其复杂,而性能上面并没有太大的提升.事实上,性能问题往往集中在某些小点,有时候很小的改动就能有巨大的提升,所以问题的关键是是怎么去找出这些优化点,幸运的是 golang 在设计的时候就考虑了这个问题,原生提供了性能分析的工具,可以很方便地帮我们找到性能瓶颈 pprof 简介 golang 的性能分析库在 runtime/pprof 里,主

mysql索引结构原理、性能分析与优化

原文  http://wulijun.github.com/2012/08/21/mysql-index-implementation-and-optimization.html 第一部分:基础知识 索引 官方介绍索引是帮助MySQL高效获取数据的数据结构.笔者理解索引相当于一本书的目录,通过目录就知道要的资料在哪里, 不用一页一页查阅找出需要的资料. 唯一索引(unique index) 强调唯一,就是索引值必须唯一. 创建索引: create unique index 索引名 on 表名(列

MySQL监控、性能分析——工具篇

MySQL越来越被更多企业接受,随着企业发展,MySQL存储数据日益膨胀,MySQL的性能分析.监控预警.容量扩展议题越来越多.“工欲善其 事,必先利其器”,那么我们如何在进行MySQL性能分析.监控预警.容量扩展问题上得到更好的解决方案,就要利用各种工具来对MySQL各种指标进行分 析.本文是读书笔记,下面提及的工具,读者可能都用过,或打算准备是使用.MySQL服务器的发布包没有包含那些能完成许多常见任务的工具,例如监控服务器的工具.比较服务器间数据的工具.我们把这些工具分成以下几类:界面.监

系统监测和性能分析工具

作为一名linux运维工程师来说,对linux系统的日常管理,检测和系统性能的分析是必不可少的.也有一些针对系统监测和性能分析的工具.咱们现在就来了解一下. tcpdump命令: 网络抓包工具,过滤数据包或者定制输出格式: 常用选项: -n :  用IP地址表示主机,用数字表示端口号. -i  : 监听网卡接口, -i  any :   抓取所有网卡接口的数据包. -v  :  输出详细信息. -t :  不打印时间戳 -e :  显示以太网帧头部信息. -x  :  以十六进制数显示数据包的内

向mysql中批量插入数据的性能分析

MYSQL批量插入数据库实现语句性能分析 假定我们的表结构如下 代码如下   CREATE TABLE example (example_id INT NOT NULL,name VARCHAR( 50 ) NOT NULL,value VARCHAR( 50 ) NOT NULL,other_value VARCHAR( 50 ) NOT NULL) 通常情况下单条插入的sql语句我们会这么写: 代码如下   INSERT INTO example(example_id, name, valu

redis常用性能分析命令

一.连接 src/redis-cli -h 10.20.137.141 -p 6379 >auth 123456789 src/redis-cli -h 10.20.137.141 -p 6379 -a 123456789 二.常用性能分析命令 src/redis-cli -h 10.20.137.141 -p 6379 -a 123456789 monitor src/redis-cli -h 10.20.137.141 -p 6379 -a 123456789 info clients|gr

SQL Server-聚焦NOT IN VS NOT EXISTS VS LEFT JOIN...IS NULL性能分析(十八)

前言 本节我们来综合比较NOT IN VS NOT EXISTS VS LEFT JOIN...IS NULL的性能,简短的内容,深入的理解,Always to review the basics. NOT IN.NOT EXISTS.LEFT JOIN...IS NULL性能分析 我们首先创建测试表 USE TSQL2012 GO CREATE SCHEMA [compare] CREATE TABLE [compare].t_left ( id INT NOT NULL PRIMARY KE

Oracle Update 语句语法与性能分析 - 多表关联

Oracle Update 语句语法与性能分析 - 多表关联 为了方便起见,建立了以下简单模型,和构造了部分测试数据: 在某个业务受理子系统BSS中, SQL 代码 --客户资料表 create table customers ( customer_id number(8) not null, -- 客户标示 city_name varchar2(10) not null, -- 所在城市 customer_type char(2) not null, -- 客户类型 ... ) create

三种Linux性能分析工具的比较

无论是在CPU设计.服务器研发还是存储系统开发的过程中,性能总是一个绕不过去的硬指标.很多时候,我们发现系统功能完备,但就是性能不尽如意,这时候就需要找到性能瓶颈.进行优化.首先我们需要结合硬件特点.操作系统和应用程序的特点深入了解系统内部的运行机制.数据流图和关键路径,最好找出核心模块.建立起抽象模型:接着需要利用各种性能分析工具,探测相关模块的热点路径.耗时统计和占比.在这方面,Linux操作系统自带了多种灵活又具有专对性的工具,此外一些厂家也开源了不少优秀的性能分析工具.下面就结合笔者最近