go 运行时:移除连接字符串{2,3,4,5}

hjqgdpho  于 4个月前  发布在  Go
关注(0)|答案(3)|浏览(50)

背景

函数 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 变更

好处

  1. 代码更清晰。
  2. 性能:
    基准代码
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 必须显示相同的结果,因为更改不影响它。

polhcujo

polhcujo1#

https://go.dev/cl/554835提到了这个问题:runtime: remove concatstring{2,3,4,5}

ilmyapht

ilmyapht2#

从提案流程中移除,不进行API更改。

相关问题