This benchmarking framework ported cross multiple languages to obtain comparible performance metrics across different implementations. In addition to performance benchmarking, it helps in other types of non-functional testing like load, reliability or concurrency.
- Measures performance in transactions per second or TPS
- Supports active (by calling Execute method) or passive (by reporting via Context) measurement methods
- Supports configuration parameters to set connection strings or other settings for benchmarks
- Runs benchmarks sequential or in proportional by allocating % of calls to each benchmark
- Measures peak or nominal measurement at specified transaction rate
- Measures system utilization (RAM and CPU) during benchmarking process
- Measures overall environment performance (CPU, Video, Disk) for objective interpretation of results
- Capture and errors or validation results
- Console runner to execute benchmarks
To run benchmark create your benchmark suit like this
package main
import (
"errors"
"time"
bench "github.com/pip-benchmark/pip-benchmark-go/benchmark"
benchconsole "github.com/pip-benchmark/pip-benchmark-go/console"
rnd "github.com/pip-services3-go/pip-services3-commons-go/random"
)
//===============================
type SampleBenchmark struct {
*bench.Benchmark
greeting string
}
func NewSampleBenchmark() *SampleBenchmark {
c := SampleBenchmark{}
// Create base benchmark and set name with description
c.Benchmark = bench.NewBenchmark("SampleBenchmark", "Measures performance of updating", "Type")
c.Benchmark.IExecutable = &c
c.greeting = "test"
return &c
}
func (c *SampleBenchmark) SetUp() error {
// Setup benckmark
// This method must be always created
// Get params from context
c.greeting = c.Context.GetParameters()["Greeting"].GetAsString()
return nil
}
func (c *SampleBenchmark) TearDown() error {
// Teardown behckmark
// This method must be always created
return nil
}
func (c *SampleBenchmark) Execute() error {
// Create testing function
// This method must be always created
// Randomly generate message or errors
if rnd.RandomBoolean.Chance(1, 10) == true {
c.Context.SendMessage(c.greeting)
} else if rnd.RandomBoolean.Chance(1, 10) == true {
c.Context.ReportError(errors.New("Something bad happend..."))
}
// Just wait and do nothing
time.Sleep(10 * time.Millisecond)
return nil
}
//===============================
type SampleBenchmarkSuite struct {
*bench.BenchmarkSuite
}
func NewSampleBenchmarkSuite() *SampleBenchmarkSuite {
c := SampleBenchmarkSuite{}
c.BenchmarkSuite = bench.NewBenchmarkSuite("Samples", "Provides sample benchmarks")
// Create parameters. They are will accessible in benchmarks from context
c.CreateParameter("Greeting", "Greeting message", "Hello world!")
c.AddBenchmark(NewSampleBenchmark().Benchmark)
return &c
}
//===============================
func main() {
// Create benchmark builder and setup it
var benchmark = benchconsole.NewConsoleBenchmarkBuilder()
benchmark.AddSuite(NewSampleBenchmarkSuite().BenchmarkSuite).
ForDuration(5).
ForceContinue(true).
WithAllBenchmarks()
runner := benchmark.Create()
// You can change benchmarking params like this
runner.Parameters().Set(map[string]string{"General.Benchmarking.MeasurementType": "Nominal"})
runner.Parameters().Set(map[string]string{"General.Benchmarking.ExecutionType": "Sequential"})
// Run bechmarking
runner.Run(func(err error) {
if err != nil {
print(err.Error())
}
})
// Print results
print(runner.Report().Generate())
}
To measure environment (CPU, video, disk)
run ./app/main.go -e
This module created and maintained by
- Sergey Seroukhov
- Levichev Dmitry