github.com/safing/portbase@v0.19.5/database/record/meta-bench_test.go (about) 1 package record 2 3 // Benchmark: 4 // BenchmarkAllocateBytes-8 2000000000 0.76 ns/op 5 // BenchmarkAllocateStruct1-8 2000000000 0.76 ns/op 6 // BenchmarkAllocateStruct2-8 2000000000 0.79 ns/op 7 // BenchmarkMetaSerializeContainer-8 1000000 1703 ns/op 8 // BenchmarkMetaUnserializeContainer-8 2000000 950 ns/op 9 // BenchmarkMetaSerializeVarInt-8 3000000 457 ns/op 10 // BenchmarkMetaUnserializeVarInt-8 20000000 62.9 ns/op 11 // BenchmarkMetaSerializeWithXDR2-8 1000000 2360 ns/op 12 // BenchmarkMetaUnserializeWithXDR2-8 500000 3189 ns/op 13 // BenchmarkMetaSerializeWithColfer-8 10000000 237 ns/op 14 // BenchmarkMetaUnserializeWithColfer-8 20000000 51.7 ns/op 15 // BenchmarkMetaSerializeWithCodegen-8 50000000 23.7 ns/op 16 // BenchmarkMetaUnserializeWithCodegen-8 100000000 18.9 ns/op 17 // BenchmarkMetaSerializeWithDSDJSON-8 1000000 2398 ns/op 18 // BenchmarkMetaUnserializeWithDSDJSON-8 300000 6264 ns/op 19 20 import ( 21 "testing" 22 "time" 23 24 "github.com/safing/portbase/container" 25 "github.com/safing/portbase/formats/dsd" 26 "github.com/safing/portbase/formats/varint" 27 ) 28 29 var testMeta = &Meta{ 30 Created: time.Now().Unix(), 31 Modified: time.Now().Unix(), 32 Expires: time.Now().Unix(), 33 Deleted: time.Now().Unix(), 34 secret: true, 35 cronjewel: true, 36 } 37 38 func BenchmarkAllocateBytes(b *testing.B) { 39 for i := 0; i < b.N; i++ { 40 _ = make([]byte, 33) 41 } 42 } 43 44 func BenchmarkAllocateStruct1(b *testing.B) { 45 for i := 0; i < b.N; i++ { 46 var newMeta Meta 47 _ = newMeta 48 } 49 } 50 51 func BenchmarkAllocateStruct2(b *testing.B) { 52 for i := 0; i < b.N; i++ { 53 _ = Meta{} 54 } 55 } 56 57 func BenchmarkMetaSerializeContainer(b *testing.B) { 58 // Start benchmark 59 for i := 0; i < b.N; i++ { 60 c := container.New() 61 c.AppendNumber(uint64(testMeta.Created)) 62 c.AppendNumber(uint64(testMeta.Modified)) 63 c.AppendNumber(uint64(testMeta.Expires)) 64 c.AppendNumber(uint64(testMeta.Deleted)) 65 switch { 66 case testMeta.secret && testMeta.cronjewel: 67 c.AppendNumber(3) 68 case testMeta.secret: 69 c.AppendNumber(1) 70 case testMeta.cronjewel: 71 c.AppendNumber(2) 72 default: 73 c.AppendNumber(0) 74 } 75 } 76 } 77 78 func BenchmarkMetaUnserializeContainer(b *testing.B) { 79 // Setup 80 c := container.New() 81 c.AppendNumber(uint64(testMeta.Created)) 82 c.AppendNumber(uint64(testMeta.Modified)) 83 c.AppendNumber(uint64(testMeta.Expires)) 84 c.AppendNumber(uint64(testMeta.Deleted)) 85 switch { 86 case testMeta.secret && testMeta.cronjewel: 87 c.AppendNumber(3) 88 case testMeta.secret: 89 c.AppendNumber(1) 90 case testMeta.cronjewel: 91 c.AppendNumber(2) 92 default: 93 c.AppendNumber(0) 94 } 95 encodedData := c.CompileData() 96 97 // Reset timer for precise results 98 b.ResetTimer() 99 100 // Start benchmark 101 for i := 0; i < b.N; i++ { 102 var newMeta Meta 103 var err error 104 var num uint64 105 c := container.New(encodedData) 106 num, err = c.GetNextN64() 107 newMeta.Created = int64(num) 108 if err != nil { 109 b.Errorf("could not decode: %s", err) 110 return 111 } 112 num, err = c.GetNextN64() 113 newMeta.Modified = int64(num) 114 if err != nil { 115 b.Errorf("could not decode: %s", err) 116 return 117 } 118 num, err = c.GetNextN64() 119 newMeta.Expires = int64(num) 120 if err != nil { 121 b.Errorf("could not decode: %s", err) 122 return 123 } 124 num, err = c.GetNextN64() 125 newMeta.Deleted = int64(num) 126 if err != nil { 127 b.Errorf("could not decode: %s", err) 128 return 129 } 130 131 flags, err := c.GetNextN8() 132 if err != nil { 133 b.Errorf("could not decode: %s", err) 134 return 135 } 136 137 switch flags { 138 case 3: 139 newMeta.secret = true 140 newMeta.cronjewel = true 141 case 2: 142 newMeta.cronjewel = true 143 case 1: 144 newMeta.secret = true 145 case 0: 146 default: 147 b.Errorf("invalid flag value: %d", flags) 148 return 149 } 150 } 151 } 152 153 func BenchmarkMetaSerializeVarInt(b *testing.B) { 154 // Start benchmark 155 for i := 0; i < b.N; i++ { 156 encoded := make([]byte, 33) 157 offset := 0 158 data := varint.Pack64(uint64(testMeta.Created)) 159 for _, part := range data { 160 encoded[offset] = part 161 offset++ 162 } 163 data = varint.Pack64(uint64(testMeta.Modified)) 164 for _, part := range data { 165 encoded[offset] = part 166 offset++ 167 } 168 data = varint.Pack64(uint64(testMeta.Expires)) 169 for _, part := range data { 170 encoded[offset] = part 171 offset++ 172 } 173 data = varint.Pack64(uint64(testMeta.Deleted)) 174 for _, part := range data { 175 encoded[offset] = part 176 offset++ 177 } 178 179 switch { 180 case testMeta.secret && testMeta.cronjewel: 181 encoded[offset] = 3 182 case testMeta.secret: 183 encoded[offset] = 1 184 case testMeta.cronjewel: 185 encoded[offset] = 2 186 default: 187 encoded[offset] = 0 188 } 189 } 190 } 191 192 func BenchmarkMetaUnserializeVarInt(b *testing.B) { 193 // Setup 194 encoded := make([]byte, 33) 195 offset := 0 196 data := varint.Pack64(uint64(testMeta.Created)) 197 for _, part := range data { 198 encoded[offset] = part 199 offset++ 200 } 201 data = varint.Pack64(uint64(testMeta.Modified)) 202 for _, part := range data { 203 encoded[offset] = part 204 offset++ 205 } 206 data = varint.Pack64(uint64(testMeta.Expires)) 207 for _, part := range data { 208 encoded[offset] = part 209 offset++ 210 } 211 data = varint.Pack64(uint64(testMeta.Deleted)) 212 for _, part := range data { 213 encoded[offset] = part 214 offset++ 215 } 216 217 switch { 218 case testMeta.secret && testMeta.cronjewel: 219 encoded[offset] = 3 220 case testMeta.secret: 221 encoded[offset] = 1 222 case testMeta.cronjewel: 223 encoded[offset] = 2 224 default: 225 encoded[offset] = 0 226 } 227 offset++ 228 encodedData := encoded[:offset] 229 230 // Reset timer for precise results 231 b.ResetTimer() 232 233 // Start benchmark 234 for i := 0; i < b.N; i++ { 235 var newMeta Meta 236 offset = 0 237 238 num, n, err := varint.Unpack64(encodedData) 239 if err != nil { 240 b.Error(err) 241 return 242 } 243 testMeta.Created = int64(num) 244 offset += n 245 246 num, n, err = varint.Unpack64(encodedData[offset:]) 247 if err != nil { 248 b.Error(err) 249 return 250 } 251 testMeta.Modified = int64(num) 252 offset += n 253 254 num, n, err = varint.Unpack64(encodedData[offset:]) 255 if err != nil { 256 b.Error(err) 257 return 258 } 259 testMeta.Expires = int64(num) 260 offset += n 261 262 num, n, err = varint.Unpack64(encodedData[offset:]) 263 if err != nil { 264 b.Error(err) 265 return 266 } 267 testMeta.Deleted = int64(num) 268 offset += n 269 270 switch encodedData[offset] { 271 case 3: 272 newMeta.secret = true 273 newMeta.cronjewel = true 274 case 2: 275 newMeta.cronjewel = true 276 case 1: 277 newMeta.secret = true 278 case 0: 279 default: 280 b.Errorf("invalid flag value: %d", encodedData[offset]) 281 return 282 } 283 } 284 } 285 286 func BenchmarkMetaSerializeWithCodegen(b *testing.B) { 287 for i := 0; i < b.N; i++ { 288 _, err := testMeta.GenCodeMarshal(nil) 289 if err != nil { 290 b.Errorf("failed to serialize with codegen: %s", err) 291 return 292 } 293 } 294 } 295 296 func BenchmarkMetaUnserializeWithCodegen(b *testing.B) { 297 // Setup 298 encodedData, err := testMeta.GenCodeMarshal(nil) 299 if err != nil { 300 b.Errorf("failed to serialize with codegen: %s", err) 301 return 302 } 303 304 // Reset timer for precise results 305 b.ResetTimer() 306 307 // Start benchmark 308 for i := 0; i < b.N; i++ { 309 var newMeta Meta 310 _, err := newMeta.GenCodeUnmarshal(encodedData) 311 if err != nil { 312 b.Errorf("failed to unserialize with codegen: %s", err) 313 return 314 } 315 } 316 } 317 318 func BenchmarkMetaSerializeWithDSDJSON(b *testing.B) { 319 for i := 0; i < b.N; i++ { 320 _, err := dsd.Dump(testMeta, dsd.JSON) 321 if err != nil { 322 b.Errorf("failed to serialize with DSD/JSON: %s", err) 323 return 324 } 325 } 326 } 327 328 func BenchmarkMetaUnserializeWithDSDJSON(b *testing.B) { 329 // Setup 330 encodedData, err := dsd.Dump(testMeta, dsd.JSON) 331 if err != nil { 332 b.Errorf("failed to serialize with DSD/JSON: %s", err) 333 return 334 } 335 336 // Reset timer for precise results 337 b.ResetTimer() 338 339 // Start benchmark 340 for i := 0; i < b.N; i++ { 341 var newMeta Meta 342 _, err := dsd.Load(encodedData, &newMeta) 343 if err != nil { 344 b.Errorf("failed to unserialize with DSD/JSON: %s", err) 345 return 346 } 347 } 348 }