| // Copyright 2021 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. |
| |
| //go:build !plan9 |
| // +build !plan9 |
| |
| package main |
| |
| import ( |
| "bufio" |
| "flag" |
| "fmt" |
| "os" |
| "strings" |
| |
| "golang.org/x/benchmarks/sweet/benchmarks/internal/driver" |
| |
| lua "github.com/yuin/gopher-lua" |
| ) |
| |
| var short bool |
| |
| func init() { |
| flag.BoolVar(&short, "short", false, "whether to run a short version of this benchmark") |
| } |
| |
| func parseFlags() error { |
| flag.Parse() |
| if flag.NArg() != 2 { |
| return fmt.Errorf("expected lua program and input for it") |
| } |
| return nil |
| } |
| |
| func parseInput(inputfile string) (string, error) { |
| f, err := os.Open(inputfile) |
| if err != nil { |
| return "", err |
| } |
| defer f.Close() |
| var builder strings.Builder |
| scanner := bufio.NewScanner(f) |
| for scanner.Scan() { |
| _, err := builder.Write(scanner.Bytes()) |
| if err != nil { |
| return "", err |
| } |
| } |
| return builder.String(), nil |
| } |
| |
| func doBenchmark(s *lua.LState, input lua.LString) error { |
| freq := lua.P{ |
| Fn: s.GetGlobal("frequency"), |
| NRet: 0, |
| Protect: true, |
| } |
| count := lua.P{ |
| Fn: s.GetGlobal("count"), |
| NRet: 0, |
| Protect: true, |
| } |
| if err := s.CallByParam(freq, input, lua.LNumber(1)); err != nil { |
| return err |
| } |
| if short { |
| return nil |
| } |
| if err := s.CallByParam(freq, input, lua.LNumber(2)); err != nil { |
| return err |
| } |
| if err := s.CallByParam(count, input, lua.LString("GGT")); err != nil { |
| return err |
| } |
| if err := s.CallByParam(count, input, lua.LString("GGTA")); err != nil { |
| return err |
| } |
| if err := s.CallByParam(count, input, lua.LString("GGTATT")); err != nil { |
| return err |
| } |
| return nil |
| } |
| |
| func run(luafile, inputfile string) error { |
| s := lua.NewState() |
| defer s.Close() |
| if err := s.DoFile(luafile); err != nil { |
| return err |
| } |
| input, err := parseInput(inputfile) |
| if err != nil { |
| return err |
| } |
| return driver.RunBenchmark("GopherLuaKNucleotide", func(_ *driver.B) error { |
| return doBenchmark(s, lua.LString(input)) |
| }, driver.InProcessMeasurementOptions...) |
| } |
| |
| func main() { |
| driver.SetFlags(flag.CommandLine) |
| if err := parseFlags(); err != nil { |
| fmt.Fprintln(os.Stderr, err) |
| os.Exit(1) |
| } |
| if err := run(flag.Arg(0), flag.Arg(1)); err != nil { |
| fmt.Fprintln(os.Stderr, err) |
| os.Exit(1) |
| } |
| } |