diff --git a/csharp/src/Google.Protobuf.Benchmarks/Google.Protobuf.Benchmarks.csproj b/csharp/src/Google.Protobuf.Benchmarks/Google.Protobuf.Benchmarks.csproj index 7432168210..e2fe2556f1 100644 --- a/csharp/src/Google.Protobuf.Benchmarks/Google.Protobuf.Benchmarks.csproj +++ b/csharp/src/Google.Protobuf.Benchmarks/Google.Protobuf.Benchmarks.csproj @@ -2,15 +2,17 @@ Exe - netcoreapp2.1 + netcoreapp3.1 ../../keys/Google.Protobuf.snk true true False + pdbonly + true - + diff --git a/csharp/src/Google.Protobuf.Benchmarks/WriteRawPrimitivesBenchmark.cs b/csharp/src/Google.Protobuf.Benchmarks/WriteRawPrimitivesBenchmark.cs index 891b877b68..66b6b4a028 100644 --- a/csharp/src/Google.Protobuf.Benchmarks/WriteRawPrimitivesBenchmark.cs +++ b/csharp/src/Google.Protobuf.Benchmarks/WriteRawPrimitivesBenchmark.cs @@ -123,9 +123,9 @@ namespace Google.Protobuf.Benchmarks { var values = varint32Values[encodedSize]; var cos = new CodedOutputStream(outputBuffer); - foreach (var value in values) + for (int i = 0; i < values.Length; i++) { - cos.WriteRawVarint32(value); + cos.WriteRawVarint32(values[i]); } cos.Flush(); cos.CheckNoSpaceLeft(); @@ -142,9 +142,9 @@ namespace Google.Protobuf.Benchmarks var values = varint32Values[encodedSize]; var span = new Span(outputBuffer); WriteContext.Initialize(ref span, out WriteContext ctx); - foreach (var value in values) + for (int i = 0; i < values.Length; i++) { - ctx.WriteUInt32(value); + ctx.WriteUInt32(values[i]); } ctx.Flush(); ctx.CheckNoSpaceLeft(); @@ -165,9 +165,9 @@ namespace Google.Protobuf.Benchmarks { var values = varint64Values[encodedSize]; var cos = new CodedOutputStream(outputBuffer); - foreach (var value in values) + for (int i = 0; i < values.Length; i++) { - cos.WriteRawVarint64(value); + cos.WriteRawVarint64(values[i]); } cos.Flush(); cos.CheckNoSpaceLeft(); @@ -189,9 +189,9 @@ namespace Google.Protobuf.Benchmarks var values = varint64Values[encodedSize]; var span = new Span(outputBuffer); WriteContext.Initialize(ref span, out WriteContext ctx); - foreach (var value in values) + for (int i = 0; i < values.Length; i++) { - ctx.WriteUInt64(value); + ctx.WriteUInt64(values[i]); } ctx.Flush(); ctx.CheckNoSpaceLeft(); @@ -202,7 +202,7 @@ namespace Google.Protobuf.Benchmarks { const int encodedSize = sizeof(uint); var cos = new CodedOutputStream(outputBuffer); - for(int i = 0; i < BytesToWrite / encodedSize; i++) + for (int i = 0; i < BytesToWrite / encodedSize; i++) { cos.WriteFixed32(12345); } @@ -251,6 +251,58 @@ namespace Google.Protobuf.Benchmarks ctx.CheckNoSpaceLeft(); } + [Benchmark] + public void WriteRawTag_OneByte_WriteContext() + { + const int encodedSize = 1; + var span = new Span(outputBuffer); + WriteContext.Initialize(ref span, out WriteContext ctx); + for (uint i = 0; i < BytesToWrite / encodedSize; i++) + { + ctx.WriteRawTag(16); + } + ctx.Flush(); + ctx.CheckNoSpaceLeft(); + } + + [Benchmark] + public void WriteRawTag_TwoBytes_WriteContext() + { + const int encodedSize = 2; + var span = new Span(outputBuffer); + WriteContext.Initialize(ref span, out WriteContext ctx); + for (uint i = 0; i < BytesToWrite / encodedSize; i++) + { + ctx.WriteRawTag(137, 6); + } + ctx.Flush(); + ctx.CheckNoSpaceLeft(); + } + + [Benchmark] + public void WriteRawTag_ThreeBytes_WriteContext() + { + const int encodedSize = 3; + var span = new Span(outputBuffer); + WriteContext.Initialize(ref span, out WriteContext ctx); + for (uint i = 0; i < BytesToWrite / encodedSize; i++) + { + ctx.WriteRawTag(160, 131, 1); + } + ctx.Flush(); + ctx.CheckNoSpaceLeft(); + } + + [Benchmark] + public void Baseline_WriteContext() + { + var span = new Span(outputBuffer); + WriteContext.Initialize(ref span, out WriteContext ctx); + ctx.state.position = outputBuffer.Length; + ctx.Flush(); + ctx.CheckNoSpaceLeft(); + } + [Benchmark] public void WriteRawFloat_CodedOutputStream() {