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  }