github.com/ipld/go-ipld-prime@v0.21.0/fluent/bench_test.go (about) 1 package fluent_test 2 3 import ( 4 "strings" 5 "testing" 6 7 "github.com/ipld/go-ipld-prime/codec/dagjson" 8 "github.com/ipld/go-ipld-prime/datamodel" 9 "github.com/ipld/go-ipld-prime/fluent" 10 "github.com/ipld/go-ipld-prime/fluent/qp" 11 "github.com/ipld/go-ipld-prime/node/basicnode" 12 ) 13 14 func BenchmarkQp(b *testing.B) { 15 b.ReportAllocs() 16 17 f2 := func(na datamodel.NodeAssembler, a string, b string, c string, d []string) { 18 qp.Map(4, func(ma datamodel.MapAssembler) { 19 qp.MapEntry(ma, "destination", qp.String(a)) 20 qp.MapEntry(ma, "type", qp.String(b)) 21 qp.MapEntry(ma, "source", qp.String(c)) 22 qp.MapEntry(ma, "options", qp.List(int64(len(d)), func(la datamodel.ListAssembler) { 23 for _, s := range d { 24 qp.ListEntry(la, qp.String(s)) 25 } 26 })) 27 })(na) 28 } 29 for i := 0; i < b.N; i++ { 30 n, err := qp.BuildList(basicnode.Prototype.Any, -1, func(la datamodel.ListAssembler) { 31 f2(la.AssembleValue(), // TODO: forgot to check error? 32 "/", 33 "overlay", 34 "none", 35 []string{ 36 "lowerdir=" + "/", 37 "upperdir=" + "/tmp/overlay-root/upper", 38 "workdir=" + "/tmp/overlay-root/work", 39 }, 40 ) 41 }) 42 if err != nil { 43 b.Fatal(err) 44 } 45 _ = n 46 } 47 } 48 49 func BenchmarkUnmarshal(b *testing.B) { 50 b.ReportAllocs() 51 52 var n datamodel.Node 53 var err error 54 serial := `[{ 55 "destination": "/", 56 "type": "overlay", 57 "source": "none", 58 "options": [ 59 "lowerdir=/", 60 "upperdir=/tmp/overlay-root/upper", 61 "workdir=/tmp/overlay-root/work" 62 ] 63 }]` 64 r := strings.NewReader(serial) 65 for i := 0; i < b.N; i++ { 66 nb := basicnode.Prototype.Any.NewBuilder() 67 err = dagjson.Decode(nb, r) 68 n = nb.Build() 69 r.Reset(serial) 70 } 71 _ = n 72 if err != nil { 73 b.Fatal(err) 74 } 75 } 76 77 func BenchmarkFluent(b *testing.B) { 78 b.ReportAllocs() 79 80 var n datamodel.Node 81 var err error 82 for i := 0; i < b.N; i++ { 83 n, err = fluent.BuildList(basicnode.Prototype.Any, -1, func(la fluent.ListAssembler) { 84 la.AssembleValue().CreateMap(4, func(ma fluent.MapAssembler) { 85 ma.AssembleEntry("destination").AssignString("/") 86 ma.AssembleEntry("type").AssignString("overlay") 87 ma.AssembleEntry("source").AssignString("none") 88 ma.AssembleEntry("options").CreateList(-1, func(la fluent.ListAssembler) { 89 la.AssembleValue().AssignString("lowerdir=" + "/") 90 la.AssembleValue().AssignString("upperdir=" + "/tmp/overlay-root/upper") 91 la.AssembleValue().AssignString("workdir=" + "/tmp/overlay-root/work") 92 }) 93 }) 94 }) 95 } 96 _ = n 97 if err != nil { 98 b.Fatal(err) 99 } 100 } 101 102 func BenchmarkReflect(b *testing.B) { 103 b.ReportAllocs() 104 105 var n datamodel.Node 106 var err error 107 val := []interface{}{ 108 map[string]interface{}{ 109 "destination": "/", 110 "type": "overlay", 111 "source": "none", 112 "options": []string{ 113 "lowerdir=/", 114 "upperdir=/tmp/overlay-root/upper", 115 "workdir=/tmp/overlay-root/work", 116 }, 117 }, 118 } 119 for i := 0; i < b.N; i++ { 120 n, err = fluent.Reflect(basicnode.Prototype.Any, val) 121 } 122 _ = n 123 if err != nil { 124 b.Fatal(err) 125 } 126 } 127 128 func BenchmarkReflectIncludingInitialization(b *testing.B) { 129 b.ReportAllocs() 130 131 var n datamodel.Node 132 var err error 133 for i := 0; i < b.N; i++ { 134 n, err = fluent.Reflect(basicnode.Prototype.Any, []interface{}{ 135 map[string]interface{}{ 136 "destination": "/", 137 "type": "overlay", 138 "source": "none", 139 "options": []string{ 140 "lowerdir=/", 141 "upperdir=/tmp/overlay-root/upper", 142 "workdir=/tmp/overlay-root/work", 143 }, 144 }, 145 }) 146 } 147 _ = n 148 if err != nil { 149 b.Fatal(err) 150 } 151 } 152 153 func BenchmarkAgonizinglyBare(b *testing.B) { 154 b.ReportAllocs() 155 156 var n datamodel.Node 157 var err error 158 for i := 0; i < b.N; i++ { 159 n, err = fab() 160 } 161 _ = n 162 if err != nil { 163 b.Fatal(err) 164 } 165 } 166 167 func fab() (datamodel.Node, error) { 168 nb := basicnode.Prototype.Any.NewBuilder() 169 la1, err := nb.BeginList(-1) 170 if err != nil { 171 return nil, err 172 } 173 ma, err := la1.AssembleValue().BeginMap(4) 174 if err != nil { 175 return nil, err 176 } 177 va, err := ma.AssembleEntry("destination") 178 if err != nil { 179 return nil, err 180 } 181 err = va.AssignString("/") 182 if err != nil { 183 return nil, err 184 } 185 va, err = ma.AssembleEntry("type") 186 if err != nil { 187 return nil, err 188 } 189 err = va.AssignString("overlay") 190 if err != nil { 191 return nil, err 192 } 193 va, err = ma.AssembleEntry("source") 194 if err != nil { 195 return nil, err 196 } 197 err = va.AssignString("none") 198 if err != nil { 199 return nil, err 200 } 201 va, err = ma.AssembleEntry("options") 202 if err != nil { 203 return nil, err 204 } 205 la2, err := va.BeginList(-4) 206 if err != nil { 207 return nil, err 208 } 209 err = la2.AssembleValue().AssignString("lowerdir=" + "/") 210 if err != nil { 211 return nil, err 212 } 213 err = la2.AssembleValue().AssignString("upperdir=" + "/tmp/overlay-root/upper") 214 if err != nil { 215 return nil, err 216 } 217 err = la2.AssembleValue().AssignString("workdir=" + "/tmp/overlay-root/work") 218 if err != nil { 219 return nil, err 220 } 221 err = la2.Finish() 222 if err != nil { 223 return nil, err 224 } 225 err = ma.Finish() 226 if err != nil { 227 return nil, err 228 } 229 err = la1.Finish() 230 if err != nil { 231 return nil, err 232 } 233 return nb.Build(), nil 234 }