github.com/glycerine/zebrapack@v4.1.1-0.20181107023619-e955d028f9bf+incompatible/slides/state-of-go/stdlib/sort/sort_test.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "math/rand" 6 "os" 7 "sort" 8 "strconv" 9 "testing" 10 ) 11 12 type Person struct { 13 Name string 14 AgeYears int 15 SSN int 16 } 17 18 type byName []Person 19 20 func (b byName) Len() int { return len(b) } 21 func (b byName) Less(i, j int) bool { return b[i].Name < b[j].Name } 22 func (b byName) Swap(i, j int) { b[i], b[j] = b[j], b[i] } 23 24 type byAge []Person 25 26 func (b byAge) Len() int { return len(b) } 27 func (b byAge) Less(i, j int) bool { return b[i].AgeYears < b[j].AgeYears } 28 func (b byAge) Swap(i, j int) { b[i], b[j] = b[j], b[i] } 29 30 type bySSN []Person 31 32 func (b bySSN) Len() int { return len(b) } 33 func (b bySSN) Less(i, j int) bool { return b[i].SSN < b[j].SSN } 34 func (b bySSN) Swap(i, j int) { b[i], b[j] = b[j], b[i] } 35 36 func BenchmarkSortSort(b *testing.B) { 37 p := manyPeople() 38 for i := 0; i < b.N; i++ { 39 sort.Sort(byName(p)) 40 sort.Sort(byAge(p)) 41 sort.Sort(bySSN(p)) 42 } 43 } 44 45 func BenchmarkSortSlice(b *testing.B) { 46 p := manyPeople() 47 for i := 0; i < b.N; i++ { 48 sort.Slice(p, func(i, j int) bool { return p[i].Name < p[j].Name }) 49 sort.Slice(p, func(i, j int) bool { return p[i].AgeYears < p[j].AgeYears }) 50 sort.Slice(p, func(i, j int) bool { return p[i].SSN < p[j].SSN }) 51 } 52 } 53 54 func manyPeople() []Person { 55 n, err := strconv.Atoi(os.Getenv("N")) 56 if err != nil { 57 panic(err) 58 } 59 p := make([]Person, n) 60 for i := range p { 61 p[i].AgeYears = rand.Intn(100) 62 p[i].SSN = rand.Intn(10000000000) 63 p[i].Name = fmt.Sprintf("Mr or Ms %d", p[i].AgeYears) 64 } 65 return p 66 }