c# - 下载时内存优化

标签 c# optimization

大家好,我有以下代码,我期待着对其进行优化,因为我正在消耗大量内存,因此该例程被大量使用

第一个优化是将 stringbuilder 构造移出下载例程并使其成为类的一个字段,然后我将在例程中清除它

能否请您提出任何其他优化建议或指出一些可以帮助我解决此问题的资源(网络文章、书籍等)的方向。

我正在考虑用固定(更大)大小的缓冲区替换 stringbuilder ... 或者创建一个更大的 stringbuilder

提前致谢。

   StreamWriter _writer;
   StreamReader _reader;

   public string Download(string msgId)
   {
       _writer.WriteLine("BODY <" + msgId + ">");
       string response = _reader.ReadLine();

       if (!response.StartsWith("222"))
           return null;

       bool done = false;
       StringBuilder body = new StringBuilder(256* 1024);
       do
       {
           response = _reader.ReadLine();

           if (OnProgress != null)
               OnProgress(response.Length);

           if (response == ".")
           {
               done = true;
           }
           else 
           {
               if (response.StartsWith(".."))
                   response = response.Remove(0, 1);

               body.Append(response);
               body.Append("\r\n");
           }
       } while (!done);

       return body.ToString();
   }

最佳答案

使用固定大小的缓冲区实际上会使问题变得更糟,因为您必须选择比您可能填满的更大的大小。每次都会重新创建此缓冲区——或者如果您将它移到方法之外,则每次创建类时都会重新创建。如果您将它保留为类属性,那么它会与类存在的时间一样长,而不仅仅是方法执行的时间长度。

只要您需要将结果作为字符串返回,我就会坚持使用 StringBuilder。我能想到的唯一其他选择是将其更改为使用过滤流。也就是说,创建一个 StreamReader,它环绕您当前使用的阅读器,并以与您的 Download 方法相同的方式转换基础流。然后消费类可以简单地使用您的 StreamReader 实现,您只需处理每个 block ,而不是立即将全部内容保存在内存中。如果消费类(Class)无论如何都需要整个东西,这对你来说没什么好处,但我不知道你是如何使用它的。

关于c# - 下载时内存优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2529242/

相关文章:

c# - 在 c# 中设置/扩展 List<T> 长度

C#:根据值切换返回值类型

MySQL 修复索引,以便左连接上可能的键不为空

c - 无重复创建二维数组的最佳方法

optimization - Clojure - 优化线程映射减少

mysql - Yii 1.15 ORM - SHOW 语句太多

C# DateTime.UtcNow 返回错误值

c# - C# : Translate forward motion to up motion on the screen 中的 KINECT

c# - 字符串的持久哈希码

javascript - 如何使用 Require.js 优化项目以仅生成一个 Javascript 文件?