Browse Source

ParseRawPrimitivesBenchmark: compare CodedInputStream vs ParseContext

Jan Tattermusch 5 years ago
parent
commit
5f836193c7
1 changed files with 103 additions and 6 deletions
  1. 103 6
      csharp/src/Google.Protobuf.Benchmarks/ParseRawPrimitivesBenchmark.cs

+ 103 - 6
csharp/src/Google.Protobuf.Benchmarks/ParseRawPrimitivesBenchmark.cs

@@ -35,6 +35,7 @@ using System;
 using System.Buffers.Binary;
 using System.Buffers.Binary;
 using System.Collections.Generic;
 using System.Collections.Generic;
 using System.IO;
 using System.IO;
+using System.Buffers;
 
 
 namespace Google.Protobuf.Benchmarks
 namespace Google.Protobuf.Benchmarks
 {
 {
@@ -85,7 +86,7 @@ namespace Google.Protobuf.Benchmarks
         [Arguments(3)]
         [Arguments(3)]
         [Arguments(4)]
         [Arguments(4)]
         [Arguments(5)]
         [Arguments(5)]
-        public int ParseRawVarint32(int encodedSize)
+        public int ParseRawVarint32_CodedInputStream(int encodedSize)
         {
         {
             CodedInputStream cis = new CodedInputStream(varintInputBuffers[encodedSize]);
             CodedInputStream cis = new CodedInputStream(varintInputBuffers[encodedSize]);
             int sum = 0;
             int sum = 0;
@@ -96,6 +97,23 @@ namespace Google.Protobuf.Benchmarks
             return sum;
             return sum;
         }
         }
 
 
+        [Benchmark]
+        [Arguments(1)]
+        [Arguments(2)]
+        [Arguments(3)]
+        [Arguments(4)]
+        [Arguments(5)]
+        public int ParseRawVarint32_ParseContext(int encodedSize)
+        {
+            var ctx = CreateParseContext(varintInputBuffers[encodedSize]);
+            int sum = 0;
+            for (int i = 0; i < BytesToParse / encodedSize; i++)
+            {
+                sum += ctx.ReadInt32();
+            }
+            return sum;
+        }
+
         [Benchmark]
         [Benchmark]
         [Arguments(1)]
         [Arguments(1)]
         [Arguments(2)]
         [Arguments(2)]
@@ -107,7 +125,7 @@ namespace Google.Protobuf.Benchmarks
         [Arguments(8)]
         [Arguments(8)]
         [Arguments(9)]
         [Arguments(9)]
         [Arguments(10)]
         [Arguments(10)]
-        public long ParseRawVarint64(int encodedSize)
+        public long ParseRawVarint64_CodedInputStream(int encodedSize)
         {
         {
             CodedInputStream cis = new CodedInputStream(varintInputBuffers[encodedSize]);
             CodedInputStream cis = new CodedInputStream(varintInputBuffers[encodedSize]);
             long sum = 0;
             long sum = 0;
@@ -119,7 +137,29 @@ namespace Google.Protobuf.Benchmarks
         }
         }
 
 
         [Benchmark]
         [Benchmark]
-        public uint ParseFixed32()
+        [Arguments(1)]
+        [Arguments(2)]
+        [Arguments(3)]
+        [Arguments(4)]
+        [Arguments(5)]
+        [Arguments(6)]
+        [Arguments(7)]
+        [Arguments(8)]
+        [Arguments(9)]
+        [Arguments(10)]
+        public long ParseRawVarint64_ParseContext(int encodedSize)
+        {
+            var ctx = CreateParseContext(varintInputBuffers[encodedSize]);
+            long sum = 0;
+            for (int i = 0; i < BytesToParse / encodedSize; i++)
+            {
+                sum += ctx.ReadInt64();
+            }
+            return sum;
+        }
+
+        [Benchmark]
+        public uint ParseFixed32_CodedInputStream()
         {
         {
             const int encodedSize = sizeof(uint);
             const int encodedSize = sizeof(uint);
             CodedInputStream cis = new CodedInputStream(fixedIntInputBuffer);
             CodedInputStream cis = new CodedInputStream(fixedIntInputBuffer);
@@ -132,7 +172,20 @@ namespace Google.Protobuf.Benchmarks
         }
         }
 
 
         [Benchmark]
         [Benchmark]
-        public ulong ParseFixed64()
+        public uint ParseFixed32_ParseContext()
+        {
+            const int encodedSize = sizeof(uint);
+            var ctx = CreateParseContext(fixedIntInputBuffer);
+            uint sum = 0;
+            for (uint i = 0; i < BytesToParse / encodedSize; i++)
+            {
+                sum += ctx.ReadFixed32();
+            }
+            return sum;
+        }
+
+        [Benchmark]
+        public ulong ParseFixed64_CodedInputStream()
         {
         {
             const int encodedSize = sizeof(ulong);
             const int encodedSize = sizeof(ulong);
             CodedInputStream cis = new CodedInputStream(fixedIntInputBuffer);
             CodedInputStream cis = new CodedInputStream(fixedIntInputBuffer);
@@ -145,7 +198,20 @@ namespace Google.Protobuf.Benchmarks
         }
         }
 
 
         [Benchmark]
         [Benchmark]
-        public float ParseRawFloat()
+        public ulong ParseFixed64_ParseContext()
+        {
+            const int encodedSize = sizeof(ulong);
+            var ctx = CreateParseContext(fixedIntInputBuffer);
+            ulong sum = 0;
+            for (int i = 0; i < BytesToParse / encodedSize; i++)
+            {
+                sum += ctx.ReadFixed64();
+            }
+            return sum;
+        }
+
+        [Benchmark]
+        public float ParseRawFloat_CodedInputStream()
         {
         {
             const int encodedSize = sizeof(float);
             const int encodedSize = sizeof(float);
             CodedInputStream cis = new CodedInputStream(floatInputBuffer);
             CodedInputStream cis = new CodedInputStream(floatInputBuffer);
@@ -158,7 +224,20 @@ namespace Google.Protobuf.Benchmarks
         }
         }
 
 
         [Benchmark]
         [Benchmark]
-        public double ParseRawDouble()
+        public float ParseRawFloat_ParseContext()
+        {
+            const int encodedSize = sizeof(float);
+            var ctx = CreateParseContext(floatInputBuffer);
+            float sum = 0;
+            for (int i = 0; i < BytesToParse / encodedSize; i++)
+            {
+               sum += ctx.ReadFloat();
+            }
+            return sum;
+        }
+
+        [Benchmark]
+        public double ParseRawDouble_CodedInputStream()
         {
         {
             const int encodedSize = sizeof(double);
             const int encodedSize = sizeof(double);
             CodedInputStream cis = new CodedInputStream(doubleInputBuffer);
             CodedInputStream cis = new CodedInputStream(doubleInputBuffer);
@@ -170,6 +249,24 @@ namespace Google.Protobuf.Benchmarks
             return sum;
             return sum;
         }
         }
 
 
+        [Benchmark]
+        public double ParseRawDouble_ParseContext()
+        {
+            const int encodedSize = sizeof(double);
+            var ctx = CreateParseContext(doubleInputBuffer);
+            double sum = 0;
+            for (int i = 0; i < BytesToParse / encodedSize; i++)
+            {
+                sum += ctx.ReadDouble();
+            }
+            return sum;
+        }
+
+        private static ParseContext CreateParseContext(byte[] buffer)
+        {
+            return new ParseContext(new ReadOnlySequence<byte>(buffer));
+        }
+
         private static byte[] CreateBufferWithRandomVarints(Random random, int valueCount, int encodedSize, int paddingValueCount)
         private static byte[] CreateBufferWithRandomVarints(Random random, int valueCount, int encodedSize, int paddingValueCount)
         {
         {
             MemoryStream ms = new MemoryStream();
             MemoryStream ms = new MemoryStream();