...
Run Format

Source file test/bench/go1/regexp_test.go

Documentation: test/bench/go1

  // Copyright 2013 The Go Authors. All rights reserved.
  // Use of this source code is governed by a BSD-style
  // license that can be found in the LICENSE file.
  
  package go1
  
  import (
  	"math/rand"
  	"regexp"
  	"testing"
  )
  
  // benchmark based on regexp/exec_test.go
  
  var regexpText []byte
  
  func makeRegexpText(n int) []byte {
  	rand.Seed(0) // For reproducibility.
  	if len(regexpText) >= n {
  		return regexpText[:n]
  	}
  	regexpText = make([]byte, n)
  	for i := range regexpText {
  		if rand.Intn(30) == 0 {
  			regexpText[i] = '\n'
  		} else {
  			regexpText[i] = byte(rand.Intn(0x7E+1-0x20) + 0x20)
  		}
  	}
  	return regexpText
  }
  
  func benchmark(b *testing.B, re string, n int) {
  	r := regexp.MustCompile(re)
  	t := makeRegexpText(n)
  	b.ResetTimer()
  	b.SetBytes(int64(n))
  	for i := 0; i < b.N; i++ {
  		if r.Match(t) {
  			b.Fatal("match!")
  		}
  	}
  }
  
  const (
  	easy0  = "ABCDEFGHIJKLMNOPQRSTUVWXYZ$"
  	easy1  = "A[AB]B[BC]C[CD]D[DE]E[EF]F[FG]G[GH]H[HI]I[IJ]J$"
  	medium = "[XYZ]ABCDEFGHIJKLMNOPQRSTUVWXYZ$"
  	hard   = "[ -~]*ABCDEFGHIJKLMNOPQRSTUVWXYZ$"
  )
  
  func BenchmarkRegexpMatchEasy0_32(b *testing.B)  { benchmark(b, easy0, 32<<0) }
  func BenchmarkRegexpMatchEasy0_1K(b *testing.B)  { benchmark(b, easy0, 1<<10) }
  func BenchmarkRegexpMatchEasy1_32(b *testing.B)  { benchmark(b, easy1, 32<<0) }
  func BenchmarkRegexpMatchEasy1_1K(b *testing.B)  { benchmark(b, easy1, 1<<10) }
  func BenchmarkRegexpMatchMedium_32(b *testing.B) { benchmark(b, medium, 1<<0) }
  func BenchmarkRegexpMatchMedium_1K(b *testing.B) { benchmark(b, medium, 1<<10) }
  func BenchmarkRegexpMatchHard_32(b *testing.B)   { benchmark(b, hard, 32<<0) }
  func BenchmarkRegexpMatchHard_1K(b *testing.B)   { benchmark(b, hard, 1<<10) }
  

View as plain text