aboutsummaryrefslogtreecommitdiff
path: root/src/ProtocolBuffers/CodedOutputStream.cs
diff options
context:
space:
mode:
authorcsharptest <roger@csharptest.net>2011-06-09 19:47:56 -0500
committerrogerk <devnull@localhost>2011-06-09 19:47:56 -0500
commitced18e10ae9ca41f338c9e788642d705dd17f9d4 (patch)
tree334ca02758aca596df2b71fb4ada50db71aa4913 /src/ProtocolBuffers/CodedOutputStream.cs
parent367e02261c6bee9bce37cb6942bd6cbf743fb67c (diff)
downloadprotobuf-ced18e10ae9ca41f338c9e788642d705dd17f9d4.tar.gz
protobuf-ced18e10ae9ca41f338c9e788642d705dd17f9d4.tar.bz2
protobuf-ced18e10ae9ca41f338c9e788642d705dd17f9d4.zip
Several performance tweaks
- Removed default value assingment when default is equal to default(T) - Added Benchmarks for most types and repeated/packed arrays - Left PopsicleList's list fields uninitialized util needed - Changed CodedInputStream's repated/packed reader - Changed Enum writers to simply cast to int - Changed the WriteEnum to use object rawValue that provides .ToString() if needed - Should be fully on par with original library for performance, gaining 2x-3x in some cases
Diffstat (limited to 'src/ProtocolBuffers/CodedOutputStream.cs')
-rw-r--r--src/ProtocolBuffers/CodedOutputStream.cs29
1 files changed, 18 insertions, 11 deletions
diff --git a/src/ProtocolBuffers/CodedOutputStream.cs b/src/ProtocolBuffers/CodedOutputStream.cs
index 0bc4a462..37355412 100644
--- a/src/ProtocolBuffers/CodedOutputStream.cs
+++ b/src/ProtocolBuffers/CodedOutputStream.cs
@@ -40,6 +40,7 @@ using System.Globalization;
using System.IO;
using System.Runtime.InteropServices;
using System.Text;
+using Google.ProtocolBuffers.Collections;
using Google.ProtocolBuffers.Descriptors;
namespace Google.ProtocolBuffers
@@ -272,7 +273,7 @@ namespace Google.ProtocolBuffers
WriteRawVarint32(value);
}
- public void WriteEnum(int fieldNumber, string fieldName, int value, string textValue)
+ public void WriteEnum(int fieldNumber, string fieldName, int value, object textValue)
{
WriteTag(fieldNumber, WireFormat.WireType.Varint);
WriteRawVarint32((uint) value);
@@ -349,11 +350,14 @@ namespace Google.ProtocolBuffers
WriteBool(fieldNumber, fieldName, value);
break;
case FieldType.Enum:
- foreach (T value in list)
+ if (default(T) is System.Enum)
+ {
+ foreach (int value in ((ICastArray)list).CastArray<int>())
+ WriteEnum(fieldNumber, fieldName, value, null/*not used*/);
+ }
+ else
{
- if (value is System.Enum)
- WriteEnum(fieldNumber, fieldName, ((IConvertible)value).ToInt32(CultureInfo.InvariantCulture), null/*not used*/);
- else
+ foreach (T value in list)
WriteEnum(fieldNumber, fieldName, ((IEnumLite)value).Number, null/*not used*/);
}
break;
@@ -449,11 +453,14 @@ namespace Google.ProtocolBuffers
WriteBoolNoTag(value);
break;
case FieldType.Enum:
- foreach (T value in list)
+ if (default(T) is System.Enum)
+ {
+ foreach (int value in ((ICastArray)list).CastArray<int>())
+ WriteEnumNoTag(value);
+ }
+ else
{
- if (value is System.Enum)
- WriteEnumNoTag(((IConvertible)value).ToInt32(CultureInfo.InvariantCulture));
- else
+ foreach (T value in list)
WriteEnumNoTag(((IEnumLite)value).Number);
}
break;
@@ -529,7 +536,7 @@ namespace Google.ProtocolBuffers
break;
case FieldType.Enum:
if (value is System.Enum)
- WriteEnum(fieldNumber, fieldName, ((IConvertible)value).ToInt32(CultureInfo.InvariantCulture), null/*not used*/);
+ WriteEnum(fieldNumber, fieldName, (int)value, null/*not used*/);
else
WriteEnum(fieldNumber, fieldName, ((IEnumLite)value).Number, null/*not used*/);
break;
@@ -593,7 +600,7 @@ namespace Google.ProtocolBuffers
break;
case FieldType.Enum:
if (value is System.Enum)
- WriteEnumNoTag(((IConvertible)value).ToInt32(CultureInfo.InvariantCulture));
+ WriteEnumNoTag((int)value);
else
WriteEnumNoTag(((IEnumLite)value).Number);
break;