We had the following code:
public static void WriteDataToRequest(HttpWebRequest req, string data) { var byteArray = Encoding.UTF8.GetBytes(data); req.ContentLength = byteArray.Length; using (var dataStream = req.GetRequestStream()) { dataStream.Write(byteArray, 0, byteArray.Length); dataStream.Flush(); } }
And that is a problem, because it allocates the memory twice, once for the string, once for the buffer. I changed that to this:
public static void WriteDataToRequest(HttpWebRequest req, string data) { var byteCount = Encoding.UTF8.GetByteCount(data); req.ContentLength = byteCount; using (var dataStream = req.GetRequestStream()) { if(byteCount <= 0x1000) // small size, just let the system allocate it { var bytes = Encoding.UTF8.GetBytes(data); dataStream.Write(bytes, 0, bytes.Length); dataStream.Flush(); return; } var buffer = new byte[0x1000]; var maxCharsThatCanFitInBuffer = buffer.Length / Encoding.UTF8.GetMaxByteCount(1); var charBuffer = new char[maxCharsThatCanFitInBuffer]; int start = 0; var encoder = Encoding.UTF8.GetEncoder(); while (start < data.Length) { var charCount = Math.Min(charBuffer.Length, data.Length - start); data.CopyTo(start, charBuffer, 0, charCount); var bytes = encoder.GetBytes(charBuffer, 0, charCount, buffer, 0, false); dataStream.Write(buffer, 0, bytes); start += charCount; } dataStream.Flush(); } }
And I was quite proud of myself.
Then I realized that I was stupid. Why?