p := &onePassProg{
Start: prog.Start,
NumCap: prog.NumCap,
+ Inst: make([]onePassInst, len(prog.Inst)),
}
- for _, inst := range prog.Inst {
- p.Inst = append(p.Inst, onePassInst{Inst: inst})
+ for i, inst := range prog.Inst {
+ p.Inst[i] = onePassInst{Inst: inst}
}
// rewrites one or more common Prog constructs that enable some otherwise
import (
"reflect"
"regexp/syntax"
+ "strings"
"testing"
)
{`^.bc(d|e)*$`, onePass},
{`^(?:(?:aa)|.)$`, notOnePass},
{`^(?:(?:a{1,2}){1,2})$`, notOnePass},
+ {`^l` + strings.Repeat("o", 2<<8) + `ng$`, onePass},
}
func TestCompileOnePass(t *testing.T) {
}
}
}
+
+func BenchmarkCompileOnepass(b *testing.B) {
+ for _, test := range onePassTests {
+ if test.onePass == notOnePass {
+ continue
+ }
+ name := test.re
+ if len(name) > 20 {
+ name = name[:20] + "..."
+ }
+ b.Run(name, func(b *testing.B) {
+ b.ReportAllocs()
+ for i := 0; i < b.N; i++ {
+ if _, err := Compile(test.re); err != nil {
+ b.Fatal(err)
+ }
+ }
+ })
+ }
+}