|
@@ -35,6 +35,7 @@ using System;
|
|
|
using System.Buffers.Binary;
|
|
|
using System.Collections.Generic;
|
|
|
using System.IO;
|
|
|
+using System.Buffers;
|
|
|
|
|
|
namespace Google.Protobuf.Benchmarks
|
|
|
{
|
|
@@ -85,7 +86,7 @@ namespace Google.Protobuf.Benchmarks
|
|
|
[Arguments(3)]
|
|
|
[Arguments(4)]
|
|
|
[Arguments(5)]
|
|
|
- public int ParseRawVarint32(int encodedSize)
|
|
|
+ public int ParseRawVarint32_CodedInputStream(int encodedSize)
|
|
|
{
|
|
|
CodedInputStream cis = new CodedInputStream(varintInputBuffers[encodedSize]);
|
|
|
int sum = 0;
|
|
@@ -96,6 +97,23 @@ namespace Google.Protobuf.Benchmarks
|
|
|
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]
|
|
|
[Arguments(1)]
|
|
|
[Arguments(2)]
|
|
@@ -107,7 +125,7 @@ namespace Google.Protobuf.Benchmarks
|
|
|
[Arguments(8)]
|
|
|
[Arguments(9)]
|
|
|
[Arguments(10)]
|
|
|
- public long ParseRawVarint64(int encodedSize)
|
|
|
+ public long ParseRawVarint64_CodedInputStream(int encodedSize)
|
|
|
{
|
|
|
CodedInputStream cis = new CodedInputStream(varintInputBuffers[encodedSize]);
|
|
|
long sum = 0;
|
|
@@ -119,7 +137,29 @@ namespace Google.Protobuf.Benchmarks
|
|
|
}
|
|
|
|
|
|
[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);
|
|
|
CodedInputStream cis = new CodedInputStream(fixedIntInputBuffer);
|
|
@@ -132,7 +172,20 @@ namespace Google.Protobuf.Benchmarks
|
|
|
}
|
|
|
|
|
|
[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);
|
|
|
CodedInputStream cis = new CodedInputStream(fixedIntInputBuffer);
|
|
@@ -145,7 +198,20 @@ namespace Google.Protobuf.Benchmarks
|
|
|
}
|
|
|
|
|
|
[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);
|
|
|
CodedInputStream cis = new CodedInputStream(floatInputBuffer);
|
|
@@ -158,7 +224,20 @@ namespace Google.Protobuf.Benchmarks
|
|
|
}
|
|
|
|
|
|
[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);
|
|
|
CodedInputStream cis = new CodedInputStream(doubleInputBuffer);
|
|
@@ -170,6 +249,24 @@ namespace Google.Protobuf.Benchmarks
|
|
|
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)
|
|
|
{
|
|
|
MemoryStream ms = new MemoryStream();
|