구글 성능 1: 문자열과 비트 변환

2422 단어 Go
구글 문자열과 비트 변환 성능
테스트 환경: go version go 1.7.3 windows/amd64
파일 구조:
루트 파일/01 byteToStringgo
루트 파일/01 byteToStringtest.go(전환 효율 테스트용)
01byteToString.go
package go1_6

import "unsafe"

func StringToByte(s string) []byte {
    //[]byte(s)処理はまず文字列をコピーしてbyteに転換を行う
    return []byte(s)
}

func ByteToString(b []byte) string {
    return string(b)
}

//StringToByteにより早いし 余裕メモリが利用なし
func StringToBytePerf(s string) []byte {
    //メモリで直接転換可能
    x := (*[2]uintptr)(unsafe.Pointer(&s)) //stringは静的系ためメモリ中にポインタで  x[0] : メモリスタート場所  x[1] : 長さ
    h := [3]uintptr{x[0], x[1], x[1]}      // []byteは動的ためメモリ中にポインタで x[0] : メモリスタート場所 x[1] : 実際長さ(len) x[2] : 良いした長さ(cap)
    return *(*[]byte)(unsafe.Pointer(&h))
}

//ByteToStringにより早いし 余裕メモリが利用なし
func ByteToStringPerf(b []byte) string {
    //byteポインタ直接にstirngポインタに転換(x[2]なしになる)
    return *(*string)(unsafe.Pointer(&b))
}
01byteToString_test.go
package go1_6

import (
    "github.com/stretchr/testify/assert"
    "testing"
)

const StringTest = "hello, world!"

func TestStringToByte(t *testing.T) {
    assert.Equal(t, StringToByte(StringTest), []byte(StringTest))
}

func TestByteToString(t *testing.T) {
    assert.Equal(t, ByteToString([]byte(StringTest)), StringTest)
}

func BenchmarkStringToByte(b *testing.B) {
    for i := 0; i < b.N; i++ {
        StringToByte(StringTest)
    }
}

func BenchmarkByteToString(b *testing.B) {
    for i := 0; i < b.N; i++ {
        ByteToString([]byte(StringTest))
    }
}

//---------------------------------------------------------------------

func TestStringToBytePerf(t *testing.T) {
    assert.Equal(t, StringToBytePerf(StringTest), []byte(StringTest))
}

func TestByteToStringPerf(t *testing.T) {
    assert.Equal(t, ByteToStringPerf([]byte(StringTest)), StringTest)
}

func BenchmarkStringToBytePerf(b *testing.B) {
    for i := 0; i < b.N; i++ {
        StringToBytePerf(StringTest)
    }
}

func BenchmarkByteToStringPerf(b *testing.B) {
    for i := 0; i < b.N; i++ {
        ByteToStringPerf([]byte(StringTest))
    }
}
테스트 결과:

점:
string 구조: [3]uintpttr{x[0], x[1], x[2]}
[]byte 구조: [2]uintpttr{x[0], x[1]}
단점:
변수 포인터 변경.(사용 시 주의)

좋은 웹페이지 즐겨찾기