From d526e5e79ca7182f1e6c88514bfa58c0e70b7d9e Mon Sep 17 00:00:00 2001 From: Rob Pike Date: Tue, 12 Mar 2013 16:50:10 -0700 Subject: [PATCH] go/test/bench/go1: add regexp test R=golang-dev, bradfitz CC=golang-dev https://golang.org/cl/7480047 --- test/bench/go1/regexp_test.go | 59 +++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 test/bench/go1/regexp_test.go diff --git a/test/bench/go1/regexp_test.go b/test/bench/go1/regexp_test.go new file mode 100644 index 0000000000..3ce9f3a2c6 --- /dev/null +++ b/test/bench/go1/regexp_test.go @@ -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) }