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;