]> Cypherpunks repositories - gostls13.git/commitdiff
go/test/bench/go1: add regexp test
authorRob Pike <r@golang.org>
Tue, 12 Mar 2013 23:50:10 +0000 (16:50 -0700)
committerRob Pike <r@golang.org>
Tue, 12 Mar 2013 23:50:10 +0000 (16:50 -0700)
R=golang-dev, bradfitz
CC=golang-dev
https://golang.org/cl/7480047

test/bench/go1/regexp_test.go [new file with mode: 0644]

diff --git a/test/bench/go1/regexp_test.go b/test/bench/go1/regexp_test.go
new file mode 100644 (file)
index 0000000..3ce9f3a
--- /dev/null
@@ -0,0 +1,59 @@
+// 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) }