背景
函数 runtime.concatstring{2,3,4,5}
是通过提交 24699fb 添加的,以避免使用 C 语言中的可变参数(相应地用 C 语言编写)。在这些函数被提交 61dca94 替换为 Golang 代码后,函数只调用 runtime.concatstrings()
,仅此而已。
建议
删除 runtime.concatstring{2,3,4,5}
并仅使用 runtime.concatstrings(*tmpBuf, []string) string
。
API 变更
无
好处
- 代码更清晰。
- 性能:
基准代码
package main
import "testing"
func concat2(a, b string) string {
return a + b
}
func concat3(a, b, c string) string {
return a + b + c
}
func concat4(a, b, c, d string) string {
return a + b + c + d
}
func concat5(a, b, c, d, e string) string {
return a + b + c + d + e
}
func concat6(a, b, c, d, e, f string) string {
return a + b + c + d + e + f
}
var a = "foo"
var _b = "bar"
var c = "baz"
var d = "ipsum"
var e = "lorem"
var f = "dolor"
func BenchmarkConcat2(b *testing.B) {
for i := 0; i < b.N; i++ {
_ = concat2(a, _b)
}
}
func BenchmarkConcat3(b *testing.B) {
for i := 0; i < b.N; i++ {
_ = concat3(a, _b, c)
}
}
func BenchmarkConcat4(b *testing.B) {
for i := 0; i < b.N; i++ {
_ = concat4(a, _b, c, e)
}
}
func BenchmarkConcat5(b *testing.B) {
for i := 0; i < b.N; i++ {
_ = concat5(a, _b, c, e, d)
}
}
func BenchmarkConcat6(b *testing.B) {
for i := 0; i < b.N; i++ {
_ = concat6(a, _b, c, e, d, f)
}
}
基准结果
name old time/op new time/op delta
Concat2-10 11.3ns ± 1% 10.6ns ± 0% -6.37% (p=0.000 n=18+17)
Concat3-10 14.3ns ± 0% 13.6ns ± 3% -5.26% (p=0.000 n=18+20)
Concat4-10 18.3ns ± 5% 17.7ns ± 3% -3.17% (p=0.000 n=18+20)
Concat5-10 21.1ns ± 1% 20.6ns ± 0% -2.26% (p=0.000 n=18+18)
Concat6-10 23.2ns ± 2% 23.3ns ± 0% ~ (p=0.084 n=18+19)
Concat6 必须显示相同的结果,因为更改不影响它。
3条答案
按热度按时间polhcujo1#
https://go.dev/cl/554835提到了这个问题:
runtime: remove concatstring{2,3,4,5}
ilmyapht2#
从提案流程中移除,不进行API更改。
n53p2ov03#
See #27801 though