Go 字符串连接+=与strings.Join性能对比

Go字符串连接

对于字符串的连接大致有两种方式:

1、通过+号连接

func StrPlus1(a []string) string {
    var s, sep string
    for i := 0; i < len(a); i++ {
        s += sep + a[i]
        sep = " "
    }
    return s
}

2、通过strings.Join连接

func StrPlus2(a []string) string {
    return strings.Join(a, " ")
}

对比两种方式的效率,通过压力测试进行对比

import "testing"

func BenchmarkStrPlus1(b *testing.B) {
    for i := 0; i < b.N; i++ {
        StrPlus1([]string{"xxx", "bbb", "aaa"})
    }
}

func BenchmarkStrPlus2(b *testing.B) {
    for i := 0; i < b.N; i++ {
        StrPlus2([]string{"xxx", "bbb", "aaa"})
    }
}

运行压力测试go test -test.bench=".*"

goos: darwin
goarch: amd64
BenchmarkStrPlus1-4     10000000               127 ns/op
BenchmarkStrPlus2-4     20000000                78.7 ns/op

从本机来看通过+号连接字符串每个操作消耗127ns时间,strings.Join消耗78.7ns。效率上strings.Join更高

来看下strings包中Join的实现

// Join concatenates the elements of a to create a single string. The separator string
// sep is placed between elements in the resulting string.
func Join(a []string, sep string) string {
    switch len(a) {
    case 0:
        return ""
    case 1:
        return a[0]
    case 2:
        // Special case for common small values.
        // Remove if golang.org/issue/6714 is fixed
        return a[0] + sep + a[1]
    case 3:
        // Special case for common small values.
        // Remove if golang.org/issue/6714 is fixed
        return a[0] + sep + a[1] + sep + a[2]
    }
    n := len(sep) * (len(a) - 1)
    for i := 0; i < len(a); i++ {
        n += len(a[i])
    }

    b := make([]byte, n)
    bp := copy(b, a[0])
    for _, s := range a[1:] {
        bp += copy(b[bp:], sep)
        bp += copy(b[bp:], s)
    }
    return string(b)
}

可以看出当连接字符串数量较大时,是先通过make分配足够的空间,然后把每个字符串copy到空间里面,而不是每次通过+号来多次分配内存。

原文地址:https://www.cnblogs.com/promenader/p/10098694.html

时间: 2024-10-19 09:06:13

Go 字符串连接+=与strings.Join性能对比的相关文章

JS中三种字符串连接方式及其性能比较

工作中经常会碰到要把2个或多个字符串连接成一个字符串的问题,在JS中处理这类问题一般有三种方法,这里将它们一一列出顺便也对它们的性能做个具体的比较. 第一种方法  用连接符“+”把要连接的字符串连起来: str="a"; str+="b"; 毫无疑问,这种方法是最便捷快速的,如果只连接100个以下的字符串建议用这种方法最方便. 第二种方法  以数组作为中介用 join 连接字符串: var arr=new Array(); arr.push(a); arr.push

python字符串连接超过2个,用join代替+号

python字符串连接效率问题 在python效率的讨论问题中字符串的连接效率有提过,多数建议使用join来代替"+"进行字符串连接 python中一切皆对象 字符串对象就是c api中得stringobject.c看python源码的objects文件可以找到 1."+".使用加号连接2个字符串会调用静态函数string_concat(register PyStringObject *a ,register PyObject * b),在这个函数中会开辟一块大小是

[笔记]Go语言的字符串拼装方式性能对比

Go语言中字符串的拼装方法很多,那么问题来了,到底哪家性能好? 下面代码,分别比较了 fmt.Sprintf,string +,strings.Join,bytes.Buffer,方法是循环若干次比较总时间. 在VMWare下的Ubuntu 14.04下运行的结果表明: fmt.Sprintf 和 strings.Join 速度相当 string + 比上述二者快一倍 bytes.Buffer又比上者快约400-500倍 如果循环内每次都临时声明一个bytes.Buffer来使用,会比持续存在慢

Android4种网络连接方式HttpClient、HttpURLConnection、OKHttp和Volley优缺点和性能对比

比较的指标: 1.cpu 2.流量 3.电量 4.内存占用 5.联网时间 功能点: 1.重试机制 2.提供的扩展功能 3.易用性 4.是否https 5.是否支持reflect api,OkHttp有配套方法 6.缓存.重试 7.cookie支持session  id会话支持 8.弱网性能和稳定性 9.超时时间,几种超时时间   连接超时,响应超时 10.适配各种机型.4.4和之前版本  2.3  4.1 5.0 4种网络连接方式提供的功能对比表格: 缓存 重试 Https/Http 稳定性 C

第51条:当心字符串连接的性能

字符串连接操作符(“+”)是把多个字符串合并为一个字符串的便利途径.要想产生单独一行的输出,或者构造一个字符串来表示一个较小的.大小固定的对象,使用连接操作符是合适的.但对于为连接n个字符串而重复地使用字符串连接操作符,需要n的平方级的时间,这是由于字符串不可变,当两个字符串被连接在一起,它们的内容都要被拷贝. public String statement() { String result = ""; for(int i=0; i < numItems(); i++) res

使用httpclient实现http链接池与使用HttpURLConnection发送http请求的方法与性能对比

使用httpclient实现http链接池与使用HttpURLConnection发送http请求的方法与性能对比 在项目中需要使用http调用接口,实现了两套发送http请求的方法,一个是使用apache的httpclient提供的http链接池来发送http请求,另一个是使用java原生的HttpURLConnection来发送http请求,并对两者性能进行了对比. 使用httpclient中的链接池发送http请求 使用最新的4.5.2版httpclient进行实现.在maven中引入 <

几种常见的字符串连接方法连接速度分析

在平时的开发中难免会遇到字符串拼接的情况.比较常用的方法有:StringBuilder,+运算符,string.Format和string.Concat. 在.NET程序员中一直流传着一个传说:StringBuilder的性能可以吊打+运算符.不知道大家有没有亲自测试过这个传说,反正我以前没有没测试过. 通过查看源代码可以发现string.Format是通过调用StringBuilder中的方法来实现字符串拼接的.而且相对来说string.Format对字符串的格式很友好.所以在平时的开发中我最

不同Framework下StringBuilder和String的性能对比,及不同Framework性能比(附Demo)

本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephisto)写的,SourceLink 阅读目录 介绍 环境搭建 测试用例 MSDN说明 我的理解 Demo下载 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephisto)写的,SourceLink 介绍   自己对String和StringBuilder的处理机制略懂,大胆的设想下两者的性能对比会出现什么样的令人意外的

Python 中,字符串&quot;连接&quot;效率最高的方式是?一定出乎你的意料

网上很多文章人云亦云,字符串连接应该使用「join」方法而不要用「+」操作.说前者效率更高,它以更少的代价创建新字符串,如果用「+」连接多个字符串,每连接一次,就要为字符串分配一次内存,效率显得有点低,这样的解释听起来很有道理,但 Cpython 解释器是不是真的按照我们说的这样呢? 今天做了一个试验,结果可能会出乎你的意料. defjoin(n): s = "".join((str(i) fori inrange(n))) defformat(n): ( "{}"