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
diff --git a/src/ProtocolBuffers/CodedOutputStream.cs b/src/ProtocolBuffers/CodedOutputStream.cs
index 0bc4a46..3735541 100644
--- a/src/ProtocolBuffers/CodedOutputStream.cs
+++ b/src/ProtocolBuffers/CodedOutputStream.cs
@@ -40,6 +40,7 @@
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 @@
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 @@
WriteBool(fieldNumber, fieldName, value);
break;
case FieldType.Enum:
- foreach (T value in list)
+ if (default(T) is System.Enum)
{
- if (value is System.Enum)
- WriteEnum(fieldNumber, fieldName, ((IConvertible)value).ToInt32(CultureInfo.InvariantCulture), null/*not used*/);
- else
+ foreach (int value in ((ICastArray)list).CastArray<int>())
+ WriteEnum(fieldNumber, fieldName, value, null/*not used*/);
+ }
+ else
+ {
+ foreach (T value in list)
WriteEnum(fieldNumber, fieldName, ((IEnumLite)value).Number, null/*not used*/);
}
break;
@@ -449,11 +453,14 @@
WriteBoolNoTag(value);
break;
case FieldType.Enum:
- foreach (T value in list)
+ if (default(T) is System.Enum)
{
- if (value is System.Enum)
- WriteEnumNoTag(((IConvertible)value).ToInt32(CultureInfo.InvariantCulture));
- else
+ foreach (int value in ((ICastArray)list).CastArray<int>())
+ WriteEnumNoTag(value);
+ }
+ else
+ {
+ foreach (T value in list)
WriteEnumNoTag(((IEnumLite)value).Number);
}
break;
@@ -529,7 +536,7 @@
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 @@
break;
case FieldType.Enum:
if (value is System.Enum)
- WriteEnumNoTag(((IConvertible)value).ToInt32(CultureInfo.InvariantCulture));
+ WriteEnumNoTag((int)value);
else
WriteEnumNoTag(((IEnumLite)value).Number);
break;