Browse Source

Optimization to avoid foreach over empty lists.

Jon Skeet 10 years ago
parent
commit
9b66768e25
1 changed files with 64 additions and 9 deletions
  1. 64 9
      csharp/src/ProtocolBuffers/CodedOutputStream.cs

+ 64 - 9
csharp/src/ProtocolBuffers/CodedOutputStream.cs

@@ -543,19 +543,14 @@ namespace Google.Protobuf
         #endregion
 
         #region Write array members
-        public void WriteGroupArray<T>(int fieldNumber, RepeatedField<T> list)
+        public void WriteMessageArray<T>(int fieldNumber, RepeatedField<T> list)
             where T : IMessage
         {
-            foreach (IMessage value in list)
+            if (list.Count == 0)
             {
-                WriteGroup(fieldNumber, value);
+                return;
             }
-        }
-
-        public void WriteMessageArray<T>(int fieldNumber, RepeatedField<T> list)
-            where T : IMessage
-        {
-            foreach (IMessage value in list)
+            foreach (T value in list)
             {
                 WriteMessage(fieldNumber, value);
             }
@@ -563,6 +558,10 @@ namespace Google.Protobuf
 
         public void WriteStringArray(int fieldNumber, RepeatedField<string> list)
         {
+            if (list.Count == 0)
+            {
+                return;
+            }
             foreach (var value in list)
             {
                 WriteString(fieldNumber, value);
@@ -571,6 +570,10 @@ namespace Google.Protobuf
 
         public void WriteBytesArray(int fieldNumber, RepeatedField<ByteString> list)
         {
+            if (list.Count == 0)
+            {
+                return;
+            }
             foreach (var value in list)
             {
                 WriteBytes(fieldNumber, value);
@@ -579,6 +582,10 @@ namespace Google.Protobuf
 
         public void WriteBoolArray(int fieldNumber, RepeatedField<bool> list)
         {
+            if (list.Count == 0)
+            {
+                return;
+            }
             foreach (var value in list)
             {
                 WriteBool(fieldNumber, value);
@@ -587,6 +594,10 @@ namespace Google.Protobuf
 
         public void WriteInt32Array(int fieldNumber, RepeatedField<int> list)
         {
+            if (list.Count == 0)
+            {
+                return;
+            }
             foreach (var value in list)
             {
                 WriteInt32(fieldNumber, value);
@@ -595,6 +606,10 @@ namespace Google.Protobuf
 
         public void WriteSInt32Array(int fieldNumber, RepeatedField<int> list)
         {
+            if (list.Count == 0)
+            {
+                return;
+            }
             foreach (var value in list)
             {
                 WriteSInt32(fieldNumber, value);
@@ -603,6 +618,10 @@ namespace Google.Protobuf
 
         public void WriteUInt32Array(int fieldNumber, RepeatedField<uint> list)
         {
+            if (list.Count == 0)
+            {
+                return;
+            }
             foreach (var value in list)
             {
                 WriteUInt32(fieldNumber, value);
@@ -611,6 +630,10 @@ namespace Google.Protobuf
 
         public void WriteFixed32Array(int fieldNumber, RepeatedField<uint> list)
         {
+            if (list.Count == 0)
+            {
+                return;
+            }
             foreach (var value in list)
             {
                 WriteFixed32(fieldNumber, value);
@@ -619,6 +642,10 @@ namespace Google.Protobuf
 
         public void WriteSFixed32Array(int fieldNumber, RepeatedField<int> list)
         {
+            if (list.Count == 0)
+            {
+                return;
+            }
             foreach (var value in list)
             {
                 WriteSFixed32(fieldNumber, value);
@@ -627,6 +654,10 @@ namespace Google.Protobuf
 
         public void WriteInt64Array(int fieldNumber, RepeatedField<long> list)
         {
+            if (list.Count == 0)
+            {
+                return;
+            }
             foreach (var value in list)
             {
                 WriteInt64(fieldNumber, value);
@@ -635,6 +666,10 @@ namespace Google.Protobuf
 
         public void WriteSInt64Array(int fieldNumber, RepeatedField<long> list)
         {
+            if (list.Count == 0)
+            {
+                return;
+            }
             foreach (var value in list)
             {
                 WriteSInt64(fieldNumber, value);
@@ -643,6 +678,10 @@ namespace Google.Protobuf
 
         public void WriteUInt64Array(int fieldNumber, RepeatedField<ulong> list)
         {
+            if (list.Count == 0)
+            {
+                return;
+            }
             foreach (var value in list)
             {
                 WriteUInt64(fieldNumber, value);
@@ -651,6 +690,10 @@ namespace Google.Protobuf
 
         public void WriteFixed64Array(int fieldNumber, RepeatedField<ulong> list)
         {
+            if (list.Count == 0)
+            {
+                return;
+            }
             foreach (var value in list)
             {
                 WriteFixed64(fieldNumber, value);
@@ -659,6 +702,10 @@ namespace Google.Protobuf
 
         public void WriteSFixed64Array(int fieldNumber, RepeatedField<long> list)
         {
+            if (list.Count == 0)
+            {
+                return;
+            }
             foreach (var value in list)
             {
                 WriteSFixed64(fieldNumber, value);
@@ -667,6 +714,10 @@ namespace Google.Protobuf
 
         public void WriteDoubleArray(int fieldNumber, RepeatedField<double> list)
         {
+            if (list.Count == 0)
+            {
+                return;
+            }
             foreach (var value in list)
             {
                 WriteDouble(fieldNumber, value);
@@ -675,6 +726,10 @@ namespace Google.Protobuf
 
         public void WriteFloatArray(int fieldNumber, RepeatedField<float> list)
         {
+            if (list.Count == 0)
+            {
+                return;
+            }
             foreach (var value in list)
             {
                 WriteFloat(fieldNumber, value);