git.templeos.me/xultist/go-enry/v2@v2.0.0-20230215093429-6ef3e87f47c0/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  }