any-sync/cmd/benchmarks/dbbench.go
2022-10-11 23:01:41 +02:00

164 lines
3.7 KiB
Go

package main
import (
"fmt"
"github.com/anytypeio/go-anytype-infrastructure-experiments/cmd/benchmarks/db"
"net/http"
_ "net/http/pprof"
"os"
"os/signal"
"syscall"
"time"
)
func main() {
//bench(db.NewPogrebSpaceCreator, options{
// numSpaces: 100,
// numEntriesInSpace: 100,
// numChangesInTree: 10,
// numHeadUpdates: 100,
// defValueSize: 1000,
// lenHeadUpdate: 10,
//})
go func() {
fmt.Println(http.ListenAndServe("localhost:6060", nil))
}()
bench(db.NewPogrebSpaceCreator, options{
numSpaces: 1000,
numEntriesInSpace: 100,
numChangesInTree: 10,
numHeadUpdates: 100,
defValueSize: 1000,
lenHeadUpdate: 10,
})
}
type options struct {
numSpaces int
numEntriesInSpace int
numChangesInTree int
numHeadUpdates int
defValueSize int
lenHeadUpdate int
}
func bench(factory db.SpaceCreatorFactory, opts options) {
spaceIdGetter := func(n int) string {
return fmt.Sprintf("space%d", n)
}
treeIdGetter := func(n int) string {
return fmt.Sprintf("tree%d", n)
}
changeIdGetter := func(n int) string {
return fmt.Sprintf("change%d", n)
}
var byteSlice []byte
for i := 0; i < opts.defValueSize; i++ {
byteSlice = append(byteSlice, byte('a'))
}
var headUpdate string
for i := 0; i < opts.lenHeadUpdate; i++ {
headUpdate += "a"
}
creator := factory()
// creating spaces
now := time.Now()
var spaces []db.Space
for i := 0; i < opts.numSpaces; i++ {
sp, err := creator.CreateSpace(spaceIdGetter(i))
if err != nil {
panic(err)
}
err = sp.Close()
if err != nil {
panic(err)
}
}
fmt.Println(opts.numSpaces, "spaces creation, spent ms", time.Now().Sub(now).Milliseconds())
now = time.Now()
// creating trees
var trees []db.Tree
for i := 0; i < opts.numSpaces; i++ {
space, err := creator.GetSpace(spaceIdGetter(i))
if err != nil {
panic(err)
}
spaces = append(spaces, space)
for j := 0; j < opts.numEntriesInSpace; j++ {
tr, err := space.CreateTree(treeIdGetter(j))
if err != nil {
panic(err)
}
trees = append(trees, tr)
}
}
fmt.Println(opts.numSpaces*opts.numEntriesInSpace, "trees creation, spent ms", time.Now().Sub(now).Milliseconds())
now = time.Now()
// filling entries and updating heads
for _, t := range trees {
for i := 0; i < opts.numChangesInTree; i++ {
err := t.AddChange(changeIdGetter(i), byteSlice)
if err != nil {
panic(err)
}
}
for i := 0; i < opts.numHeadUpdates; i++ {
err := t.UpdateHead(headUpdate)
if err != nil {
panic(err)
}
}
}
total := opts.numSpaces * opts.numEntriesInSpace * opts.numChangesInTree
fmt.Println(total, "changes creation, spent ms", time.Now().Sub(now).Milliseconds())
now = time.Now()
// getting some values from tree
for _, t := range trees {
for i := 0; i < opts.numChangesInTree; i++ {
res, err := t.GetChange(changeIdGetter(i))
if err != nil {
panic(err)
}
if res == nil {
panic("shouldn't be empty")
}
}
}
fmt.Println(total, "changes getting, spent ms", time.Now().Sub(now).Milliseconds())
now = time.Now()
// getting some values from tree
for _, t := range trees {
for i := 0; i < opts.numChangesInTree; i++ {
b, err := t.HasChange(changeIdGetter(i))
if err != nil {
panic(err)
}
if !b {
panic("should be able to check with has")
}
}
}
fmt.Println(total, "changes checking, spent ms", time.Now().Sub(now).Milliseconds())
exit := make(chan os.Signal, 1)
signal.Notify(exit, os.Interrupt, syscall.SIGKILL, syscall.SIGTERM, syscall.SIGQUIT)
sig := <-exit
for _, sp := range spaces {
err := sp.Close()
if err != nil {
panic(err)
}
}
err := creator.Close()
if err != nil {
panic(err)
}
fmt.Println(sig)
}