arnaucube
arnaucube/kestoPublic Self-hosted repository
kesto/treeinterface/benchmarks/bench_test.go
treeinterface/benchmarks/bench_test.goRaw
 1package benchmarks
 2
 3import (
 4	"crypto/rand"
 5	"fmt"
 6	"runtime"
 7	"testing"
 8	"time"
 9
10	"github.com/arnaucube/kesto/treeinterface/arbotree"
11	asmtree "github.com/p4u/asmt"
12	"go.vocdoni.io/dvote/censustree"
13	"go.vocdoni.io/dvote/censustree/gravitontree"
14)
15
16// func BenchmarkAddBatch(b *testing.B) {
17func TestAddBatch(t *testing.T) {
18	nLeafs := 100_000
19	fmt.Printf("nCPU: %d, nLeafs: %d\n", runtime.NumCPU(), nLeafs)
20
21	// prepare inputs
22	var ks, vs [][]byte
23	for i := 0; i < nLeafs; i++ {
24		k := randomBytes(32)
25		v := randomBytes(32)
26		ks = append(ks, k)
27		vs = append(vs, v)
28	}
29
30	tree1 := &asmtree.Tree{}
31	benchmarkAdd(t, "asmtree", tree1, ks, vs)
32
33	tree1 = &asmtree.Tree{}
34	benchmarkAddBatch(t, "asmtree", tree1, ks, vs)
35
36	tree2 := &gravitontree.Tree{}
37	benchmarkAdd(t, "gravitontree", tree2, ks, vs)
38
39	tree2 = &gravitontree.Tree{}
40	benchmarkAddBatch(t, "gravitontree", tree2, ks, vs)
41
42	tree3 := &arbotree.Tree{}
43	benchmarkAdd(t, "arbo", tree3, ks, vs)
44
45	tree3 = &arbotree.Tree{}
46	benchmarkAddBatch(t, "arbo", tree3, ks, vs)
47}
48
49func benchmarkAdd(t *testing.T, name string, tree censustree.Tree, ks, vs [][]byte) {
50	storage := t.TempDir()
51	err := tree.Init("test1", storage)
52	if err != nil {
53		t.Fatal(err)
54	}
55
56	start := time.Now()
57	for i := 0; i < len(ks); i++ {
58		if err := tree.Add(ks[i], vs[i]); err != nil {
59			t.Fatal(err)
60		}
61	}
62	printRes(t, name+".Add loop", time.Since(start))
63}
64
65func benchmarkAddBatch(t *testing.T, name string, tree censustree.Tree, ks, vs [][]byte) {
66	storage := t.TempDir()
67	err := tree.Init("test1", storage)
68	if err != nil {
69		t.Fatal(err)
70	}
71
72	start := time.Now()
73	invalids, err := tree.AddBatch(ks, vs)
74	if err != nil {
75		t.Fatal(err)
76	}
77	if len(invalids) != 0 {
78		t.Fatal("len(invalids)!=0")
79	}
80	printRes(t, name+".AddBatch", time.Since(start))
81}
82
83func printRes(t *testing.T, name string, duration time.Duration) {
84	fmt.Printf("	%s:	%s \n", name, duration)
85}
86
87func randomBytes(n int) []byte {
88	b := make([]byte, n)
89	_, err := rand.Read(b)
90	if err != nil {
91		panic(err)
92	}
93	return b
94}