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  }