| // +build go1.8 |
| |
| package main |
| |
| import ( |
| "fmt" |
| "math/rand" |
| "os" |
| "sort" |
| "strconv" |
| "testing" |
| ) |
| |
| type Person struct { |
| Name string |
| AgeYears int |
| SSN int64 |
| } |
| |
| type byName []Person |
| |
| func (b byName) Len() int { return len(b) } |
| func (b byName) Less(i, j int) bool { return b[i].Name < b[j].Name } |
| func (b byName) Swap(i, j int) { b[i], b[j] = b[j], b[i] } |
| |
| type byAge []Person |
| |
| func (b byAge) Len() int { return len(b) } |
| func (b byAge) Less(i, j int) bool { return b[i].AgeYears < b[j].AgeYears } |
| func (b byAge) Swap(i, j int) { b[i], b[j] = b[j], b[i] } |
| |
| type bySSN []Person |
| |
| func (b bySSN) Len() int { return len(b) } |
| func (b bySSN) Less(i, j int) bool { return b[i].SSN < b[j].SSN } |
| func (b bySSN) Swap(i, j int) { b[i], b[j] = b[j], b[i] } |
| |
| func BenchmarkSortSort(b *testing.B) { |
| p := manyPeople() |
| for i := 0; i < b.N; i++ { |
| sort.Sort(byName(p)) |
| sort.Sort(byAge(p)) |
| sort.Sort(bySSN(p)) |
| } |
| } |
| |
| func BenchmarkSortSlice(b *testing.B) { |
| p := manyPeople() |
| for i := 0; i < b.N; i++ { |
| sort.Slice(p, func(i, j int) bool { return p[i].Name < p[j].Name }) |
| sort.Slice(p, func(i, j int) bool { return p[i].AgeYears < p[j].AgeYears }) |
| sort.Slice(p, func(i, j int) bool { return p[i].SSN < p[j].SSN }) |
| } |
| } |
| |
| func manyPeople() []Person { |
| n, err := strconv.Atoi(os.Getenv("N")) |
| if err != nil { |
| panic(err) |
| } |
| p := make([]Person, n) |
| for i := range p { |
| p[i].AgeYears = rand.Intn(100) |
| p[i].SSN = rand.Int63n(1000000000) |
| p[i].Name = fmt.Sprintf("Mr or Ms %d", p[i].AgeYears) |
| } |
| return p |
| } |