github.com/bzz/enry@v1.6.7/benchmark_test.go (about) 1 package enry 2 3 import ( 4 "flag" 5 "io/ioutil" 6 "log" 7 "os" 8 "os/exec" 9 "path/filepath" 10 "testing" 11 12 "gopkg.in/src-d/enry.v1/data" 13 ) 14 15 type sample struct { 16 filename string 17 content []byte 18 } 19 20 var ( 21 slow bool 22 overcomeLanguage string 23 overcomeLanguages []string 24 samples []*sample 25 samplesDir string 26 cloned bool 27 ) 28 29 func TestMain(m *testing.M) { 30 var exitCode int 31 defer os.Exit(exitCode) 32 33 flag.BoolVar(&slow, "slow", false, "run benchmarks per sample for strategies too") 34 flag.Parse() 35 36 if err := cloneLinguist(linguistURL); err != nil { 37 log.Fatal(err) 38 } 39 if cloned { 40 defer os.RemoveAll(filepath.Dir(samplesDir)) 41 } 42 43 var err error 44 samples, err = getSamples(samplesDir) 45 if err != nil { 46 log.Fatal(err) 47 } 48 49 exitCode = m.Run() 50 } 51 52 func cloneLinguist(linguistURL string) error { 53 repoLinguist := os.Getenv(linguistClonedEnvVar) 54 cloned = repoLinguist == "" 55 if cloned { 56 var err error 57 repoLinguist, err = ioutil.TempDir("", "linguist-") 58 if err != nil { 59 return err 60 } 61 } 62 63 samplesDir = filepath.Join(repoLinguist, "samples") 64 65 if cloned { 66 cmd := exec.Command("git", "clone", linguistURL, repoLinguist) 67 if err := cmd.Run(); err != nil { 68 return err 69 } 70 } 71 72 cwd, err := os.Getwd() 73 if err != nil { 74 return err 75 } 76 77 if err = os.Chdir(repoLinguist); err != nil { 78 return err 79 } 80 81 cmd := exec.Command("git", "checkout", data.LinguistCommit) 82 if err := cmd.Run(); err != nil { 83 return err 84 } 85 86 if err = os.Chdir(cwd); err != nil { 87 return err 88 } 89 90 return nil 91 } 92 93 func getSamples(dir string) ([]*sample, error) { 94 samples := make([]*sample, 0, 2000) 95 err := filepath.Walk(dir, func(path string, info os.FileInfo, err error) error { 96 if err != nil { 97 return err 98 } 99 100 if info.IsDir() { 101 return nil 102 } 103 104 content, err := ioutil.ReadFile(path) 105 if err != nil { 106 return err 107 } 108 109 s := &sample{ 110 filename: path, 111 content: content, 112 } 113 114 samples = append(samples, s) 115 return nil 116 }) 117 118 return samples, err 119 } 120 121 func BenchmarkGetLanguageTotal(b *testing.B) { 122 if slow { 123 b.SkipNow() 124 } 125 126 var o string 127 b.Run("GetLanguage()_TOTAL", func(b *testing.B) { 128 for n := 0; n < b.N; n++ { 129 for _, sample := range samples { 130 o = GetLanguage(sample.filename, sample.content) 131 } 132 } 133 134 overcomeLanguage = o 135 }) 136 } 137 138 func BenchmarkClassifyTotal(b *testing.B) { 139 if slow { 140 b.SkipNow() 141 } 142 143 var o []string 144 b.Run("Classify()_TOTAL", func(b *testing.B) { 145 for n := 0; n < b.N; n++ { 146 for _, sample := range samples { 147 o = DefaultClassifier.Classify(sample.content, nil) 148 } 149 150 overcomeLanguages = o 151 } 152 }) 153 } 154 155 func BenchmarkStrategiesTotal(b *testing.B) { 156 if slow { 157 b.SkipNow() 158 } 159 160 benchmarks := []struct { 161 name string 162 strategy Strategy 163 candidates []string 164 }{ 165 {name: "GetLanguagesByModeline()_TOTAL", strategy: GetLanguagesByModeline}, 166 {name: "GetLanguagesByFilename()_TOTAL", strategy: GetLanguagesByFilename}, 167 {name: "GetLanguagesByShebang()_TOTAL", strategy: GetLanguagesByShebang}, 168 {name: "GetLanguagesByExtension()_TOTAL", strategy: GetLanguagesByExtension}, 169 {name: "GetLanguagesByContent()_TOTAL", strategy: GetLanguagesByContent}, 170 } 171 172 var o []string 173 for _, benchmark := range benchmarks { 174 b.Run(benchmark.name, func(b *testing.B) { 175 for n := 0; n < b.N; n++ { 176 for _, sample := range samples { 177 o = benchmark.strategy(sample.filename, sample.content, benchmark.candidates) 178 } 179 180 overcomeLanguages = o 181 } 182 }) 183 } 184 } 185 186 func BenchmarkGetLanguagePerSample(b *testing.B) { 187 if !slow { 188 b.SkipNow() 189 } 190 191 var o string 192 for _, sample := range samples { 193 b.Run("GetLanguage()_SAMPLE_"+sample.filename, func(b *testing.B) { 194 for n := 0; n < b.N; n++ { 195 o = GetLanguage(sample.filename, sample.content) 196 } 197 198 overcomeLanguage = o 199 }) 200 } 201 } 202 203 func BenchmarkClassifyPerSample(b *testing.B) { 204 if !slow { 205 b.SkipNow() 206 } 207 208 var o []string 209 for _, sample := range samples { 210 b.Run("Classify()_SAMPLE_"+sample.filename, func(b *testing.B) { 211 for n := 0; n < b.N; n++ { 212 o = DefaultClassifier.Classify(sample.content, nil) 213 } 214 215 overcomeLanguages = o 216 }) 217 } 218 } 219 220 func BenchmarkStrategiesPerSample(b *testing.B) { 221 if !slow { 222 b.SkipNow() 223 } 224 225 benchmarks := []struct { 226 name string 227 strategy Strategy 228 candidates []string 229 }{ 230 {name: "GetLanguagesByModeline()_SAMPLE_", strategy: GetLanguagesByModeline}, 231 {name: "GetLanguagesByFilename()_SAMPLE_", strategy: GetLanguagesByFilename}, 232 {name: "GetLanguagesByShebang()_SAMPLE_", strategy: GetLanguagesByShebang}, 233 {name: "GetLanguagesByExtension()_SAMPLE_", strategy: GetLanguagesByExtension}, 234 {name: "GetLanguagesByContent()_SAMPLE_", strategy: GetLanguagesByContent}, 235 } 236 237 var o []string 238 for _, benchmark := range benchmarks { 239 for _, sample := range samples { 240 b.Run(benchmark.name+sample.filename, func(b *testing.B) { 241 for n := 0; n < b.N; n++ { 242 o = benchmark.strategy(sample.filename, sample.content, benchmark.candidates) 243 } 244 245 overcomeLanguages = o 246 }) 247 } 248 } 249 }