go 高性能转换[]byte 和 string

 基础语法  2022-04-30  admin  911  1229

高性能转换[]byte 和 string

//这l两个函数是从网上找到的,高频函数使用时性能确实好。原因主要是使用底层指针减少内存 op(内存申请)。

// StringToBytes converts string to byte slice without a memory allocation.
func StringToBytes(s string) (b []byte) {
	sh := *(*reflect.StringHeader)(unsafe.Pointer(&s))
	bh := (*reflect.SliceHeader)(unsafe.Pointer(&b))
	bh.Data, bh.Len, bh.Cap = sh.Data, sh.Len, sh.Len
	return b
}

// BytesToString converts byte slice to string without a memory allocation.
func BytesToString(b []byte) string {
	return *(*string)(unsafe.Pointer(&b))
}

测试:

func main() {
	for i := 0; i < 5; i++ {
		test1()
		test2()
	}
}

func test1() {
	start := time.Now()
	str := ""
	str2 := ""
	for i := 0; i < 10000000; i++ {
		str = "hello" + strconv.Itoa(i)
		s := []byte(str)
		str2 = string(s)
	}
	duration := time.Since(start)
	fmt.Println("方法一用时:", duration)
	fmt.Println(str2)
}

func test2() {
	start := time.Now()
	str := ""
	str2 := ""
	for i := 0; i < 10000000; i++ {
		str = "hello" + strconv.Itoa(i)
		s := StringToBytes(str)
		str2 = BytesToString(s)
	}
	duration := time.Since(start)
	fmt.Println("方法二用时:", duration)
	fmt.Println(str2)
}


大约 30% 的性能提升


image.png

如果文章对您有帮助,点击下方的广告,支持一下作者吧!

转载必须注明出处:

go 高性能转换[]byte 和 string —— code.cent123.com

相关推荐


esp32 使用mqtt 通讯

esp32 使用mqtt 通讯基于go的mqtt 客户端packagemain import( &quot;fmt&quot; &quot;github.com/gogf/gf/v2/encoding/gjson&quot; &quot;github.com/gogf/gf/v2/frame/g&quot; &quot;gobot.io/x/gobot&quot; &qu

GoFrame 框架中使用 mqtt 协议通讯

GoFrame 框架中使用 mqtt//SPDX-License-Identifier:MIT //SPDX-FileCopyrightText:2022mochi-mqtt,mochi-co //SPDX-FileContributor:mochi-co packagemqtt import( &quot;flag&quot; &quot;gfmqtt/internal/

go 生成密码 php的 password_hash go实现

packagemain import( &quot;fmt&quot; &quot;golang.org/x/crypto/bcrypt&quot; ) funcmain(){ hashedPassword:=passwordHash(&quot;123456&quot;) fmt.Println(hashedPassword) hashedPassword=

go 递归读取目录,并生成树形结构的数据

go 递归读取目录,并生成树形结构的数据//读取目录中的所有文件,如果是目录则递归读取,生成结构化的树形struct packagemain import( &quot;encoding/json&quot; &quot;fmt&quot; &quot;os&quot; &quot;path/filepath&quot; ) //TreeNode文件的树形结构体 ty