Home > Blockchain >  Golang benchmark setup database
Golang benchmark setup database

Time:09-20

I have to write some benchmarks that require a specific database setup. Something like this:

func BenchmarkXxx(b *testing.B) {
  fmt.Println("Setup")
  dropRecords()
  createDatabaseRecords() // this require a lot of time

  fmt.Println("Start Test")
  b.ResetTimer()
  for i := 0; i < b.N; i   {
    fmt.Println("Loop")
    TestMyStuffs()
  }
}

Running this benchmark I can see in the console that the "Setup" and "Start Test" are printing many times, so the BenchmarkXxx function seems to be called many times. Is there a way to run a setup code (createDatabaseRecords in this example) only one time and only for a specific benchmark?

Is there any sort of "best practice" to do this?

CodePudding user response:

You can use sub-tests for this case, using b.Run

func BenchmarkXxx(b *testing.B) {
    fmt.Println("Setup")
    setup() // this require a lot of time
    fmt.Println("Start Test")

    b.Run("mytest", func(b *testing.B) {
        b.ResetTimer()
        for i := 0; i < b.N; i   {
            fmt.Println("Loop")
            testMyStuffs()
        }
    })

}

A subbenchmark is like any other benchmark. A benchmark that calls Run at least once will not be measured itself and will be called once with N=1.

Thus BenchmarkXxx is called once, to do setup.

  • Related