Files
kopia/cli/command_benchmark.go
Julio Lopez 7db061ee71 build(deps): Go 1.25 (#4987)
Upgrade to Go 1.25
Leverage `WaitGroup.Go` in Go 1.25
2025-11-17 16:42:12 -08:00

83 lines
1.6 KiB
Go

package cli
import (
"bytes"
"sync"
)
type commandBenchmark struct {
compression commandBenchmarkCompression
crypto commandBenchmarkCrypto
hashing commandBenchmarkHashing
encryption commandBenchmarkEncryption
splitters commandBenchmarkSplitters
ecc commandBenchmarkEcc
}
func (c *commandBenchmark) setup(svc appServices, parent commandParent) {
cmd := parent.Command("benchmark", "Commands to test performance of algorithms.")
c.compression.setup(svc, cmd)
c.crypto.setup(svc, cmd)
c.splitters.setup(svc, cmd)
c.hashing.setup(svc, cmd)
c.encryption.setup(svc, cmd)
c.ecc.setup(svc, cmd)
}
type cryptoBenchResult struct {
hash string
encryption string
throughput float64
}
func runInParallelNoInputNoResult(n int, run func()) {
dummyArgs := make([]int, n)
runInParallelNoResult(dummyArgs, func(_ int) {
run()
})
}
func runInParallelNoInput[T any](n int, run func() T) T {
dummyArgs := make([]int, n)
return runInParallel(dummyArgs, func(_ int) T {
return run()
})
}
func runInParallelNoResult[A any](args []A, run func(arg A)) {
runInParallel(args, func(arg A) any {
run(arg)
return nil
})
}
func runInParallel[A, T any](args []A, run func(arg A) T) T {
var wg sync.WaitGroup
for _, arg := range args[1:] {
wg.Go(func() {
run(arg)
})
}
// run one on the main goroutine and N-1 in parallel.
v := run(args[0])
wg.Wait()
return v
}
func makeOutputBuffers(n, capacity int) []*bytes.Buffer {
var res []*bytes.Buffer
for range n {
res = append(res, bytes.NewBuffer(make([]byte, 0, capacity)))
}
return res
}