구글 성능 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.gopackage 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]}
단점:
변수 포인터 변경.(사용 시 주의)
Reference
이 문제에 관하여(구글 성능 1: 문자열과 비트 변환), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/oywc410/items/bb00d183c8c73c4803df텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)