golang高性能string转byte
func StringBytes(s string) []byte {
return *(*[]byte)(unsafe.Pointer(&s))
}
func BytesString(b []byte) string {
return *(*string)(unsafe.Pointer(&b))
}
func OriginStringBytes(s string) []byte {
return []byte(s)
}
func OriginBytesString(b []byte) string {
return string(b)
}
然后分别测试
package main
import (
"math/rand"
"testing"
)
var letters = []byte("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
var a = randSeqString(10000)
var c = randSeqByte(10000)
func randSeqString(n int) string {
b := make([]byte, n)
for i := range b {
b[i] = letters[rand.Intn(len(letters))]
}
return string(b)
}
func randSeqByte(n int) []byte {
b := make([]byte, n)
for i := range b {
b[i] = letters[rand.Intn(len(letters))]
}
return b
}
func Benchmark_StringBytes(b *testing.B) {
for i := 0; i < b.N; i++ { //use b.N for looping
StringBytes(a)
}
}
func Benchmark_BytesString(b *testing.B) {
for i := 0; i < b.N; i++ { //use b.N for looping
BytesString(c)
}
}
func Benchmark_OriginStringBytes(b *testing.B) {
for i := 0; i < b.N; i++ { //use b.N for looping
OriginStringBytes(a)
}
}
go test -test.bench=".*"
goos: linux
goarch: amd64
pkg: test/test5
Benchmark_StringBytes-4 2000000000 0.72 ns/op
Benchmark_BytesString-4 2000000000 1.16 ns/op
Benchmark_OriginStringBytes-4 300000 4649 ns/op
PASS
ok test/test5 5.398s