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}