Stupid smart code

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?

原文地址:https://www.cnblogs.com/shihao/p/2320677.html