1 // Copyright 2013 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package go1 6 7 import ( 8 "math/rand" 9 "regexp" 10 "testing" 11 ) 12 13 // benchmark based on regexp/exec_test.go 14 15 var regexpText []byte 16 17 func makeRegexpText(n int) []byte { 18 rand.Seed(0) // For reproducibility. 19 if len(regexpText) >= n { 20 return regexpText[:n] 21 } 22 regexpText = make([]byte, n) 23 for i := range regexpText { 24 if rand.Intn(30) == 0 { 25 regexpText[i] = '\n' 26 } else { 27 regexpText[i] = byte(rand.Intn(0x7E+1-0x20) + 0x20) 28 } 29 } 30 return regexpText 31 } 32 33 func benchmark(b *testing.B, re string, n int) { 34 r := regexp.MustCompile(re) 35 t := makeRegexpText(n) 36 b.ResetTimer() 37 b.SetBytes(int64(n)) 38 for i := 0; i < b.N; i++ { 39 if r.Match(t) { 40 b.Fatal("match!") 41 } 42 } 43 } 44 45 const ( 46 easy0 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ$" 47 easy1 = "A[AB]B[BC]C[CD]D[DE]E[EF]F[FG]G[GH]H[HI]I[IJ]J$" 48 medium = "[XYZ]ABCDEFGHIJKLMNOPQRSTUVWXYZ$" 49 hard = "[ -~]*ABCDEFGHIJKLMNOPQRSTUVWXYZ$" 50 ) 51 52 func BenchmarkRegexpMatchEasy0_32(b *testing.B) { benchmark(b, easy0, 32<<0) } 53 func BenchmarkRegexpMatchEasy0_1K(b *testing.B) { benchmark(b, easy0, 1<<10) } 54 func BenchmarkRegexpMatchEasy1_32(b *testing.B) { benchmark(b, easy1, 32<<0) } 55 func BenchmarkRegexpMatchEasy1_1K(b *testing.B) { benchmark(b, easy1, 1<<10) } 56 func BenchmarkRegexpMatchMedium_32(b *testing.B) { benchmark(b, medium, 1<<0) } 57 func BenchmarkRegexpMatchMedium_1K(b *testing.B) { benchmark(b, medium, 1<<10) } 58 func BenchmarkRegexpMatchHard_32(b *testing.B) { benchmark(b, hard, 32<<0) } 59 func BenchmarkRegexpMatchHard_1K(b *testing.B) { benchmark(b, hard, 1<<10) } 60