aboutsummaryrefslogtreecommitdiff
path: root/src/ProtocolBuffers/CodedOutputStream.cs
diff options
context:
space:
mode:
authorcsharptest <roger@csharptest.net>2011-06-08 15:50:58 -0500
committerrogerk <devnull@localhost>2011-06-08 15:50:58 -0500
commit2772dfe8a1eae7c942bb50d84bda3f45b5d7b683 (patch)
tree0171c98d38d419780317398595c511810a19e203 /src/ProtocolBuffers/CodedOutputStream.cs
parent0e2d144eb6e08f841ed4476cfff23ad462bbbcd9 (diff)
downloadprotobuf-2772dfe8a1eae7c942bb50d84bda3f45b5d7b683.tar.gz
protobuf-2772dfe8a1eae7c942bb50d84bda3f45b5d7b683.tar.bz2
protobuf-2772dfe8a1eae7c942bb50d84bda3f45b5d7b683.zip
Performance fix for float/double write bytes. Performance fix, do not use Array.Copy.
Diffstat (limited to 'src/ProtocolBuffers/CodedOutputStream.cs')
-rw-r--r--src/ProtocolBuffers/CodedOutputStream.cs33
1 files changed, 28 insertions, 5 deletions
diff --git a/src/ProtocolBuffers/CodedOutputStream.cs b/src/ProtocolBuffers/CodedOutputStream.cs
index 31032058..bd508661 100644
--- a/src/ProtocolBuffers/CodedOutputStream.cs
+++ b/src/ProtocolBuffers/CodedOutputStream.cs
@@ -38,6 +38,7 @@ using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
+using System.Runtime.InteropServices;
using System.Text;
using Google.ProtocolBuffers.Descriptors;
@@ -648,7 +649,20 @@ namespace Google.ProtocolBuffers
byte[] rawBytes = BitConverter.GetBytes(value);
if (!BitConverter.IsLittleEndian)
Array.Reverse(rawBytes);
- WriteRawBytes(rawBytes, 0, 8);
+
+ if (limit - position >= 8)
+ {
+ buffer[position++] = rawBytes[0];
+ buffer[position++] = rawBytes[1];
+ buffer[position++] = rawBytes[2];
+ buffer[position++] = rawBytes[3];
+ buffer[position++] = rawBytes[4];
+ buffer[position++] = rawBytes[5];
+ buffer[position++] = rawBytes[6];
+ buffer[position++] = rawBytes[7];
+ }
+ else
+ WriteRawBytes(rawBytes, 0, 8);
#else
WriteRawLittleEndian64((ulong)BitConverter.DoubleToInt64Bits(value));
#endif
@@ -662,7 +676,16 @@ namespace Google.ProtocolBuffers
byte[] rawBytes = BitConverter.GetBytes(value);
if (!BitConverter.IsLittleEndian)
Array.Reverse(rawBytes);
- WriteRawBytes(rawBytes, 0, 4);
+
+ if (limit - position >= 4)
+ {
+ buffer[position++] = rawBytes[0];
+ buffer[position++] = rawBytes[1];
+ buffer[position++] = rawBytes[2];
+ buffer[position++] = rawBytes[3];
+ }
+ else
+ WriteRawBytes(rawBytes, 0, 4);
}
/// <summary>
@@ -985,7 +1008,7 @@ namespace Google.ProtocolBuffers
{
if (limit - position >= length)
{
- Array.Copy(value, offset, buffer, position, length);
+ Bytes.Copy(value, offset, buffer, position, length);
// We have room in the current buffer.
position += length;
}
@@ -994,7 +1017,7 @@ namespace Google.ProtocolBuffers
// Write extends past current buffer. Fill the rest of this buffer and
// flush.
int bytesWritten = limit - position;
- Array.Copy(value, offset, buffer, position, bytesWritten);
+ Bytes.Copy(value, offset, buffer, position, bytesWritten);
offset += bytesWritten;
length -= bytesWritten;
position = limit;
@@ -1006,7 +1029,7 @@ namespace Google.ProtocolBuffers
if (length <= limit)
{
// Fits in new buffer.
- Array.Copy(value, offset, buffer, 0, length);
+ Bytes.Copy(value, offset, buffer, 0, length);
position = length;
}
else