github.com/moontrade/nogc@v0.1.7/mem_test.go (about) 1 package nogc 2 3 import ( 4 "reflect" 5 "testing" 6 "unsafe" 7 ) 8 9 func TestCmp(t *testing.T) { 10 println(Cmp("hello", "hello0")) 11 println(Cmp("hello0", "hello")) 12 println(Cmp("hello", "hello")) 13 } 14 15 func BenchmarkCompare(b *testing.B) { 16 b.Run("Slow", func(b *testing.B) { 17 _a := "hello" 18 _b := "hello8" 19 __a := unsafe.Pointer(*(**uintptr)(unsafe.Pointer(&_a))) 20 __b := unsafe.Pointer(*(**uintptr)(unsafe.Pointer(&_b))) 21 22 for i := 0; i < b.N; i++ { 23 compareSlow(__a, __b, uintptr(len(_a))) 24 } 25 }) 26 b.Run("Fast", func(b *testing.B) { 27 _a := "hello" 28 _b := "hello8" 29 __a := unsafe.Pointer(*(**uintptr)(unsafe.Pointer(&_a))) 30 __b := unsafe.Pointer(*(**uintptr)(unsafe.Pointer(&_b))) 31 32 for i := 0; i < b.N; i++ { 33 Compare(__a, __b, uintptr(len(_a))) 34 } 35 }) 36 } 37 38 func compareSlow(a, b unsafe.Pointer, n uintptr) int { 39 if a == nil { 40 if b == nil { 41 return 0 42 } 43 return -1 44 } 45 ab := *(*string)(unsafe.Pointer(&reflect.SliceHeader{ 46 Data: uintptr(a), 47 Len: int(n), 48 })) 49 bb := *(*string)(unsafe.Pointer(&reflect.SliceHeader{ 50 Data: uintptr(b), 51 Len: int(n), 52 })) 53 if ab < bb { 54 return -1 55 } 56 if ab == bb { 57 return 0 58 } 59 return 1 60 } 61 62 func BenchmarkMemzero(b *testing.B) { 63 buf := make([]byte, 16) 64 buf[0] = 77 65 buf[15] = 88 66 67 Zero(unsafe.Pointer(&buf[0]), uintptr(len(buf))) 68 69 ptr := unsafe.Pointer(&buf[0]) 70 71 b.Run("memclr", func(b *testing.B) { 72 for i := 0; i < b.N; i++ { 73 Zero(ptr, uintptr(len(buf))) 74 } 75 }) 76 77 b.Run("slow", func(b *testing.B) { 78 for i := 0; i < b.N; i++ { 79 zeroSlow(ptr, uintptr(len(buf))) 80 } 81 }) 82 }