golang高性能string转byte

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


添加新评论