首页 > 编程语言 >Golang高性能编程笔记--字符串拼接

Golang高性能编程笔记--字符串拼接

时间:2023-05-18 23:24:14浏览次数:44  
标签:string -- Builder fmt Golang 拼接 str byte strings

Golang中引入五种字符串拼接方法,分别如下:

  1.+拼接法

  2.fmt.Sprintf()

  3.strings.Builder

  4.bytes.Buffer

  5.[]byte

代码示例,这里将根据《Go语言高性能编程》中的一节,来看一下这五种具体的方法:

package main

import (
	"bytes"
	"fmt"
	"math/rand"
	"strings"
	"time"
)

const letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"

func GenerateRandomStr(n string) string {
	var l = len(n)
	b := make([]byte, l)
	for i := range b {
		rand.Seed(time.Now().UnixNano())
		b[i] = letterBytes[rand.Intn(len(letterBytes))]
	}
	return string(b)
}

func PlusConcat(n int, str string) string {
	s := ""
	for i := 0; i < n; i++ {
		s += str
	}
	return s
}
func sprintfConcat(n int, str string) string {
	s := ""
	for i := 0; i < n; i++ {
		s = fmt.Sprintf("%s%s", s, str)
	}
	return s
}
func builderConcat(n int, str string) string {
	var builder strings.Builder
	for i := 0; i < n; i++ {
		builder.WriteString(str)
	}
	return builder.String()
}
func bufferConcat(n int, s string) string {
	buf := new(bytes.Buffer)
	for i := 0; i < n; i++ {
		buf.WriteString(s)
	}
	return buf.String()
}
func byteConcat(n int, str string) string {
	buf := make([]byte, 0)
	for i := 0; i < n; i++ {
		buf = append(buf, str...)
	}
	return string(buf)
}
func main() {
	var str = GenerateRandomStr("abcdefg")
	fmt.Println(str)
	fmt.Println("+拼接", PlusConcat(3, str))
	fmt.Println("fmt.Sprintf:", sprintfConcat(3, str))
	fmt.Println("strings.Builder:", builderConcat(3, str))
	fmt.Println("bytes.Buffer:", bufferConcat(3, str))
	fmt.Println("[]byte:", byteConcat(3, str))

}

官方给的建议是第三种:strings.Builder

golang对于第三种strngs.Builder还提供了预分配内存的模式:

func builderConcat(n int, str string) string {
	var builder strings.Builder
	builder.Grow(n * len(str))
	for i := 0; i < n; i++ {
		builder.WriteString(str)
	}
	return builder.String()
}

性能比较

首先看一下strings.Builder与+的差距大的原因:

字符串在 Go 语言中是不可变类型,占用内存大小是固定的,当使用 + 拼接 2 个字符串时,生成一个新的字符串,那么就需要开辟一段新的空间,新空间的大小是原来两个字符串的大小之和。拼接第三个字符串时,再开辟一段新空间,新空间大小是三个字符串大小之和,以此类推。

strings.Builderbytes.Buffer,包括切片 []byte 的内存是以倍数申请的。例如,初始大小为 0,当第一次写入大小为 10 byte 的字符串时,则会申请大小为 16 byte 的内存(恰好大于 10 byte 的 2 的指数),第二次写入 10 byte 时,内存不够,则申请 32 byte 的内存,第三次写入内存足够,则不申请新的,以此类推。

strings.Builder与bytes.Buffer,[]byte的分析

strings.Builderbytes.Buffer 底层都是 []byte 数组,但 strings.Builder 性能比 bytes.Buffer 略快约 10% 。一个比较重要的区别在于,bytes.Buffer 转化为字符串时重新申请了一块空间,存放生成的字符串变量,而 strings.Builder 直接将底层的 []byte 转换成了字符串类型返回了回来。

标签:string,--,Builder,fmt,Golang,拼接,str,byte,strings
From: https://www.cnblogs.com/99kol/p/17413583.html

相关文章

  • ZCL_TOOLS
    IntroductionHistoryPublicMethodGET_CONFIG_VALUEGET_CONFIGCONVERT_ASCII_TO_CHARCONVERT_CHAR_TO_ASCIICONVERT_FLTP_TO_CHARDESCRIBE_NAMEDESCRIBE_DATACREATE_TABLEGET_DDIFSELECTIONS_INITSELECTIONS_DIALOGLOCK_TABLEUNLOCK_TABLEUNLOCK_ALLGET_......
  • 实验十七 实时时钟实验
    实验十七实时时钟实验实验目的1.学习模拟I2C总线的软件实现方法。2.了解实时芯片PCF8563的读写方法。3.掌握单片机读写实时时钟芯片PCF8563的模块程序设计方法。实验说明实时时钟(RTC)器件介绍实时时钟(RTC)器件是一种能提供日历/时钟、数据存储等功能的专用集成电路,常用作各种......
  • ZCX_NO_CHECK
    IntroductionHistoryClassScreenRAISESyntaxPublicMethodSHOWGET_SHOW_MSGGET_SHOW_MSG_STRIntroductionClass:ZCX_NO_CHECKEnhanceExceptionClass:CX_NO_CHECKEasytotraceexceptionHistoryVersionDateNameDescriptionV0012020/12/1......
  • ZCX_STATIC_CHECK
    IntroductionHistoryClassScreenRAISESyntaxPublicMethodSHOWGET_SHOW_MSGGET_SHOW_MSG_STRIntroductionClass:ZCX_STATIC_CHECKEnhanceExceptionClass:CX_STATIC_CHECKEasytotraceexceptionHistoryVersionDateNameDescriptionV0012......
  • 「CF1718E」Impressionism
    题目点这里看题目。Burenka有两张图片$a$和$b$,它们的大小可以表示为$n\timesm$的像素组合。每幅画的每个像素都有一个颜色——表示为一个从$0$到\(2\times10^5\)的数字,并且在两幅画的每一行或每一列中都没有重复的颜色,除了颜色$0$。Burenka想把图片\(......
  • ZVL
    IntroductionHistoryBaseonReportBaseonJobIntroductionT-code:ZVLProgram:ZRVLScreenVariantValueList(byreportorjob)已排除<Theprogram"XXXX"isnotUnicode-compatible程式>Catchothererrormessage排除syntaxerrorprogram(設定於T......
  • ZTB
    IntroductionHistoryQueryFindFieldNameGetdatafromHANAEditMassChangeChangeLogsADBCQuery單表查詢/維護接入IntroductionT-code:ZTBProgram:ZRTBTable查詢/修改(僅適用addontable)/LOG/ADBC查詢目前關閉ALVSaveLayout功能HistoryVers......
  • i7 13700f和i7 13700kf区别 i713700f和i713700kf参数对比
    酷睿i7-13700F采用intel7制程工艺性能核+能效核的高性能混合构架,拥有16核24线程,包括8个性能核心以及8个能效核心,最高睿频可达5.2GHz,同时配备24MBL2缓存以及36MBL3缓存,原生支持DDR5-5600、5200高频内存,无内置核显,需搭配独立显卡使用组装电脑选i713700f还是i713700kf怎么搭配......
  • h610和b660区别 h610和b660哪个好
    内存超频的区别:B660主板是支持内存超频的,H610不支持内存超频,但对于i3-12100f是不算区别的。12代不带k的处理器都锁SA电压不能超,一般稳不了3600gear1。而H610m的主板本身最高支持3200MHz频率内存,也达到了i312100f的上限。因此,虽然H610不支持内存超频,但对于i312100f是不影响的。......
  • ZCL_QALV_DISPLAY
    IntroductionHistoryPublicMethodGRID_TABNAMEGRID_ALVIDGRID_CUSTGET_VARIANTGET_FCAT_TABNAMEGET_FCAT_ALVIDCONTAINER_FACTORYEVENTIntroductionClass:ZCL_QALV_DISPLAYALV簡化用法(純Display,不可進editmode)HistoryVersionDateNameDescrip......