首页 > 其他分享 >Golang字符串拼接性能

Golang字符串拼接性能

时间:2023-09-14 21:05:05浏览次数:42  
标签:string Builder unsafe Golang 拼接 内存 字符串 addr

问题引入

  • Golang中的string类型是只读且不可变的。因此通过循环字符串切片拼接字符串的方式会导致大量的string创建、销毁和内存分配

解决方法

通过bytes.Buffer优化

  • 使用var bs bytes.Buffer存放最终拼接好的字符串,一定程度上避免了string每进行一次拼接都重新申请内存空间的问题
  • 但依然存在一个问题:最终byte数组强转string,同样需要进行一次内存分配和内容拷贝
func (b *Buffer) String() string {
        if b == nil {
                // Special case, useful in debugging.
                return "<nil>"
        }
        return string(b.buf[b.off:])
}

通过strings.Builder优化

  • 优化一:针对最终byte数组转换string进行优化,使用了一个unsafe.Pointer的内存指针转换操作,避免了内存分配的问题
func (b *Builder) String() string {
        return *(*string)(unsafe.Pointer(&b.buf))
}
  • 优化二:通过copyCheck()来保证Builder对象被赋值后不可修改,来避免byte数组逃逸到堆上
func (b *Builder) copyCheck() {
        if b.addr == nil {
                b.addr = (*Builder)(noescape(unsafe.Pointer(b)))
        } else if b.addr != b {
                panic("strings: illegal use of non-zero Builder copied by value")
        }
}

标签:string,Builder,unsafe,Golang,拼接,内存,字符串,addr
From: https://blog.51cto.com/u_16263554/7473904

相关文章

  • C++字符串
      1,2这个形式的字符串数组,就和普通数组一样,定义后面的大括号,里面装着每个具体的值,然后3,4直接表示出来,然后其实直接3就OK了,4可能是为了方便看。   字符串数组输入部分1.这个。。先把字符串数组定义好,然后使用cin直接输入进去2.如果想要读入包含空格键之类字符串的话......
  • 字符串的拼接与输出
    研究字符串的拼接原理,字符串的拼接可以使用字符‘+’来进行操作的,任何的基础数据与字符串相加拼接成一个新的字符串,为了更好的理解字符串的拼接,我们进行测试源代码:publicclassMain{publicstaticvoidmain(String[]args){System.out.println("abc"+1.0+0.42)......
  • Java生成Json字符串
    publicclassTest01{publicstaticvoidmain(String[]args){//StringBuilderresponseMsg=newStringBuilder();//responseMsg.append("");//responseMsg.append("");//System.out.println(responseMsg.leng......
  • 字符串
    字符串基础操作正序for(inti=0;i<len;i++)//数组第一个数下标为零,最后一个数n下标为n-1倒序for(inti=len-1;i>=0;i--)函数输入一行(字符串)strings;getline(cin,s)//cin吞空格,getline不吞字符串拼接strings1,s2;s1+=s2;//将......
  • 字符串转hash值
    需求:将中文字符串转为对应的hash值packageutil;importjava.nio.charset.StandardCharsets;importjava.security.MessageDigest;importjava.security.NoSuchAlgorithmException;/***@Author:ZD*@Date:2023/8/29*/publicclassHashUtil{publicstaticlo......
  • 字符串小练习
    AC自动机P2414题目描述:阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机。打字机上只有\(28\)个按键,分别印有\(26\)个小写英文字母和B、P两个字母。经阿狸研究发现,这个打字机是这样工作的:输入小写字母,打字机的一个凹槽中会加入这个字母(这个字母加在凹槽的......
  • MySQL性能优化之 - 单表查询+代码层拼接 VS 表连接查询
    单表查询+代码端拼接的优势记得当初单位派我去阿里交流学习时,人家就说,在阿里,95%以上的查询都是单表查询,虽然我们都知道单表查询更加符合MySql底层的算法逻辑,但是单表查询+代码端拼接的优势究竟是什么,它为什么互联网企业都会使用单表查询呢?归纳而言大体分以下几点:1.激活代码端和......
  • 代码随想录算法训练营第9天| ●28. 实现 strStr() ●459.重复的子字符串 ●字符串总结
    28.找出字符串中第一个匹配项的下标mydemo--(mythought)--(falied)classSolution{public:intstrStr(stringhaystack,stringneedle){for(inti=0;i<haystack.size();i++){if(haystack[i]!=needle[0])continue;......
  • python 根据asctime字符串转成日期
    1、将asctime转换为时间戳如果将asctime转换为日期时间字符串,首先需要将asctime转换为时间戳。时间戳是指自1970年1月1日以来的秒数。Python中的time模块提供了将asctime转换为时间戳的函数mktime。importtimeasctime="FriMay1405:24:592021"t=time.mktim......
  • 代码随想录算法训练营第8天| ● 344.反转字符串 ● 541. 反转字符串II ● 剑指Offer 0
    344.反转字符串mydemo--(一次就过)--(成功)classSolution{public:voidreverseString(vector<char>&s){intlen=s.size();chartmp;inti=0;intj=len-1;while(i<j){tmp=s[i];......