【小测试】golang中使用string()来转换[]byte数组产生了拷贝

下方是benchmark的数据差异:

import (
	"reflect"
	"unsafe"
)

// NoAllocString convert []byte to string
func NoAllocString(buf []byte) string {
	return *(*string)(unsafe.Pointer(&buf))
}

benchmark代码:

// cpu: Intel(R) Core(TM) i7-7700 CPU @ 3.60GHz
// BenchmarkStringConvert
// BenchmarkStringConvert-8         4310254               242.0 ns/op
func BenchmarkStringConvert(b *testing.B) {
	buf := make([]byte, 1024)
	for i := 0; i < cap(buf); i++ {
		buf[i] = byte(rand.Intn(125-32) + 32)
	}
	total := 0
	first := 0
	for n := 0; n < b.N; n++ {
		s := string(buf)
		total += len(s)
		first += int(s[0])
	}
}

// cpu: Intel(R) Core(TM) i7-7700 CPU @ 3.60GHz
// BenchmarkStringConvert1
// BenchmarkStringConvert1-8       1000000000               0.2969 ns/op
func BenchmarkStringConvert1(b *testing.B) {
	buf := make([]byte, 1024)
	for i := 0; i < cap(buf); i++ {
		buf[i] = byte(rand.Intn(125-32) + 32)
	}
	total := 0
	first := 0
	for n := 0; n < b.N; n++ {
		s := NoAllocString(buf)
		total += len(s)
		first += int(s[0])
	}
}

从测试数据的差异来看,string()转换[]byte数组,产生了拷贝。
也说明这个unsafe代码取得的性能收益还挺大的。

上一篇:循环缓冲区-c


下一篇:C++练手小项目(基于muduo网络库+mysql+jsoncpp的简易HTTPWebServer用于网页显示数据库后台数据