mirror of
https://github.com/kopia/kopia.git
synced 2025-12-23 22:57:50 -05:00
83 lines
1.6 KiB
Go
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
|
|
}
|