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  }