在Go语言中创建相同字符的字符串最快的方法是什么?

4
我想知道创建一个由相同字符的字符串n次实例的最快方法。我能想象到一些方法,有些天真,有些则不然:

字符串连接(非常天真)

func nchars(b byte, n int) string {
    s := ""
    c := string([]byte{b})
    for i := 0; i < n; i++ {
        s += c
    }
    return s
}

字节切片

func nchars(b byte, n int) string {
    s := make([]byte, n)
    for i := 0; i < n; i++ {
        s[i] = b
    }
    return string(s)
}
2个回答

8

字节切片方法至少是在strings.Repeat中选择的方法:请参见其源代码

b := make([]byte, len(s)*count)
bp := 0
for i := 0; i < count; i++ {
        bp += copy(b[bp:], s)
}
return string(b)

所以我会选择你的第二个选择。

@synful 是的,它并不完全符合您的要求,但其实现仍然是一个很好的线索,可以确定哪个被认为是“快速”的。 - VonC
是的,老实说,由于它们复制字符串而不是单个字符所导致的开销可能相对可忽略。 - joshlf
@synful 我不这么认为。复制单个字符是一个单指令操作。复制字符串需要更多时间。也许他们将来会实现一个汇编版本。 - fuz
没错,但如果你将其放在执行的许多其他指令的上下文中,那就不算太糟糕了。我的意思是,也许会慢25%,但与O(n)和O(n ^ 2)之间的差异相比,那只是小巫见大巫。 - joshlf
@FUZxxl 你可以使用unsafe来消除字符串->[]byte的开销,但这是只读操作。 - OneOfOne

4
res1 := strings.Repeat(str1, 4)

2
请提供一个描述,为什么您认为这是一个正确的解决方案! - Mátyás Grőger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接