github.com/xzntrc/go-enry/v2@v2.0.0-20230215091818-766cc1d65498/benchmark_test.go (about) 1 package enry 2 3 import ( 4 "flag" 5 "fmt" 6 "io/ioutil" 7 "log" 8 "os" 9 "path/filepath" 10 "testing" 11 ) 12 13 type sample struct { 14 filename string 15 content []byte 16 } 17 18 var ( 19 slow bool 20 overcomeLanguage string 21 overcomeLanguages []string 22 samples []*sample 23 ) 24 25 func TestMain(m *testing.M) { 26 flag.BoolVar(&slow, "slow", false, "run benchmarks per sample for strategies too") 27 flag.Parse() 28 29 tmpLinguistDir, cleanupNeeded, err := maybeCloneLinguist() 30 if err != nil { 31 log.Fatal(err) 32 } 33 if cleanupNeeded { 34 defer os.RemoveAll(tmpLinguistDir) 35 } 36 37 samplesDir := filepath.Join(tmpLinguistDir, "samples") 38 samples, err = getSamples(samplesDir) 39 if err != nil { 40 log.Fatal(err) 41 } 42 43 os.Exit(m.Run()) 44 } 45 46 func getSamples(dir string) ([]*sample, error) { 47 samples := make([]*sample, 0, 2000) 48 err := filepath.Walk(dir, func(path string, info os.FileInfo, err error) error { 49 if err != nil { 50 return err 51 } 52 53 if info.IsDir() { 54 return nil 55 } 56 57 content, err := ioutil.ReadFile(path) 58 if err != nil { 59 return err 60 } 61 62 s := &sample{ 63 filename: path, 64 content: content, 65 } 66 samples = append(samples, s) 67 return nil 68 }) 69 return samples, err 70 } 71 72 func BenchmarkGetLanguageTotal(b *testing.B) { 73 if slow { 74 b.SkipNow() 75 } 76 77 var o string 78 b.Run("GetLanguage()_TOTAL", func(b *testing.B) { 79 for n := 0; n < b.N; n++ { 80 for _, sample := range samples { 81 o = GetLanguage(sample.filename, sample.content) 82 } 83 } 84 85 overcomeLanguage = o 86 }) 87 } 88 89 func BenchmarkClassifyTotal(b *testing.B) { 90 if slow { 91 b.SkipNow() 92 } 93 94 var o []string 95 b.Run("Classify()_TOTAL", func(b *testing.B) { 96 for n := 0; n < b.N; n++ { 97 for _, sample := range samples { 98 o = defaultClassifier.classify(sample.content, nil) 99 } 100 101 overcomeLanguages = o 102 } 103 }) 104 } 105 106 func BenchmarkStrategiesTotal(b *testing.B) { 107 if slow { 108 b.SkipNow() 109 } 110 111 benchmarks := benchmarkForAllStrategies("TOTAL") 112 113 var o []string 114 for _, benchmark := range benchmarks { 115 b.Run(benchmark.name, func(b *testing.B) { 116 for n := 0; n < b.N; n++ { 117 for _, sample := range samples { 118 o = benchmark.strategy(sample.filename, sample.content, benchmark.candidates) 119 } 120 121 overcomeLanguages = o 122 } 123 }) 124 } 125 } 126 127 func BenchmarkGetLanguagePerSample(b *testing.B) { 128 if !slow { 129 b.SkipNow() 130 } 131 132 var o string 133 for _, sample := range samples { 134 b.Run("GetLanguage()_SAMPLE_"+sample.filename, func(b *testing.B) { 135 for n := 0; n < b.N; n++ { 136 o = GetLanguage(sample.filename, sample.content) 137 } 138 139 overcomeLanguage = o 140 }) 141 } 142 } 143 144 func BenchmarkClassifyPerSample(b *testing.B) { 145 if !slow { 146 b.SkipNow() 147 } 148 149 var o []string 150 for _, sample := range samples { 151 b.Run("Classify()_SAMPLE_"+sample.filename, func(b *testing.B) { 152 for n := 0; n < b.N; n++ { 153 o = defaultClassifier.classify(sample.content, nil) 154 } 155 156 overcomeLanguages = o 157 }) 158 } 159 } 160 161 func BenchmarkStrategiesPerSample(b *testing.B) { 162 if !slow { 163 b.SkipNow() 164 } 165 166 benchmarks := benchmarkForAllStrategies("SAMPLE") 167 168 var o []string 169 for _, benchmark := range benchmarks { 170 for _, sample := range samples { 171 b.Run(benchmark.name+sample.filename, func(b *testing.B) { 172 for n := 0; n < b.N; n++ { 173 o = benchmark.strategy(sample.filename, sample.content, benchmark.candidates) 174 } 175 176 overcomeLanguages = o 177 }) 178 } 179 } 180 } 181 182 type strategyName struct { 183 name string 184 strategy Strategy 185 candidates []string 186 } 187 188 func benchmarkForAllStrategies(class string) []strategyName { 189 return []strategyName{ 190 {name: fmt.Sprintf("GetLanguagesByModeline()_%s_", class), strategy: GetLanguagesByModeline}, 191 {name: fmt.Sprintf("GetLanguagesByFilename()_%s_", class), strategy: GetLanguagesByFilename}, 192 {name: fmt.Sprintf("GetLanguagesByShebang()_%s_", class), strategy: GetLanguagesByShebang}, 193 {name: fmt.Sprintf("GetLanguagesByExtension()_%s_", class), strategy: GetLanguagesByExtension}, 194 {name: fmt.Sprintf("GetLanguagesByContent()_%s_", class), strategy: GetLanguagesByContent}, 195 } 196 }