Skip to content

Commit

Permalink
commands: Make benchmark non-global
Browse files Browse the repository at this point in the history
  • Loading branch information
bep committed Apr 11, 2018
1 parent 1157fef commit fdf1d94
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 26 deletions.
66 changes: 41 additions & 25 deletions commands/benchmark.go
Expand Up @@ -23,50 +23,66 @@ import (
jww "github.com/spf13/jwalterweatherman"
)

var (
var _ cmder = (*benchmarkCmd)(nil)

type cmder interface {
getCommand() *cobra.Command
}

type benchmarkCmd struct {
benchmarkTimes int
cpuProfileFile string
memProfileFile string
)

var benchmarkCmd = &cobra.Command{
Use: "benchmark",
Short: "Benchmark Hugo by building a site a number of times.",
Long: `Hugo can build a site many times over and analyze the running process
creating a benchmark.`,
cmd *cobra.Command
}

func (c *benchmarkCmd) getCommand() *cobra.Command {
return c.cmd
}

func init() {
initHugoBuilderFlags(benchmarkCmd)
initBenchmarkBuildingFlags(benchmarkCmd)
func newBenchmarkCmd() *benchmarkCmd {
cmd := &cobra.Command{
Use: "benchmark",
Short: "Benchmark Hugo by building a site a number of times.",
Long: `Hugo can build a site many times over and analyze the running process
creating a benchmark.`,
}

initHugoBuilderFlags(cmd)
initBenchmarkBuildingFlags(cmd)

c := &benchmarkCmd{cmd: cmd}

cmd.Flags().StringVar(&c.cpuProfileFile, "cpuprofile", "", "path/filename for the CPU profile file")
cmd.Flags().StringVar(&c.memProfileFile, "memprofile", "", "path/filename for the memory profile file")
cmd.Flags().IntVarP(&c.benchmarkTimes, "count", "n", 13, "number of times to build the site")

benchmarkCmd.Flags().StringVar(&cpuProfileFile, "cpuprofile", "", "path/filename for the CPU profile file")
benchmarkCmd.Flags().StringVar(&memProfileFile, "memprofile", "", "path/filename for the memory profile file")
benchmarkCmd.Flags().IntVarP(&benchmarkTimes, "count", "n", 13, "number of times to build the site")
cmd.RunE = c.benchmark

benchmarkCmd.RunE = benchmark
return c
}

func benchmark(cmd *cobra.Command, args []string) error {
func (c *benchmarkCmd) benchmark(cmd *cobra.Command, args []string) error {
cfgInit := func(c *commandeer) error {
return nil
}
c, err := InitializeConfig(false, cfgInit, benchmarkCmd)
comm, err := InitializeConfig(false, cfgInit, c.cmd)
if err != nil {
return err
}

var memProf *os.File
if memProfileFile != "" {
memProf, err = os.Create(memProfileFile)
if c.memProfileFile != "" {
memProf, err = os.Create(c.memProfileFile)
if err != nil {
return err
}
}

var cpuProf *os.File
if cpuProfileFile != "" {
cpuProf, err = os.Create(cpuProfileFile)
if c.cpuProfileFile != "" {
cpuProf, err = os.Create(c.cpuProfileFile)
if err != nil {
return err
}
Expand All @@ -81,8 +97,8 @@ func benchmark(cmd *cobra.Command, args []string) error {
}

t := time.Now()
for i := 0; i < benchmarkTimes; i++ {
if err = c.resetAndBuildSites(); err != nil {
for i := 0; i < c.benchmarkTimes; i++ {
if err = comm.resetAndBuildSites(); err != nil {
return err
}
}
Expand All @@ -102,9 +118,9 @@ func benchmark(cmd *cobra.Command, args []string) error {
totalMallocs := memStats.Mallocs - mallocs

jww.FEEDBACK.Println()
jww.FEEDBACK.Printf("Average time per operation: %vms\n", int(1000*totalTime.Seconds()/float64(benchmarkTimes)))
jww.FEEDBACK.Printf("Average memory allocated per operation: %vkB\n", totalMemAllocated/uint64(benchmarkTimes)/1024)
jww.FEEDBACK.Printf("Average allocations per operation: %v\n", totalMallocs/uint64(benchmarkTimes))
jww.FEEDBACK.Printf("Average time per operation: %vms\n", int(1000*totalTime.Seconds()/float64(c.benchmarkTimes)))
jww.FEEDBACK.Printf("Average memory allocated per operation: %vkB\n", totalMemAllocated/uint64(c.benchmarkTimes)/1024)
jww.FEEDBACK.Printf("Average allocations per operation: %v\n", totalMallocs/uint64(c.benchmarkTimes))

return nil
}
2 changes: 1 addition & 1 deletion commands/hugo.go
Expand Up @@ -198,7 +198,7 @@ func AddCommands() {
HugoCmd.AddCommand(envCmd)
HugoCmd.AddCommand(configCmd)
HugoCmd.AddCommand(checkCmd)
HugoCmd.AddCommand(benchmarkCmd)
HugoCmd.AddCommand(newBenchmarkCmd().getCommand())
HugoCmd.AddCommand(convertCmd)
HugoCmd.AddCommand(newCmd)
HugoCmd.AddCommand(listCmd)
Expand Down

0 comments on commit fdf1d94

Please sign in to comment.