优化内存使用

时间:2012-04-05 02:01:10

标签: c# memorystream

public static byte[] Compress(byte[] data)
{
    using (MemoryStream ms = new MemoryStream())
    {
        using (DeflateStream ds = new DeflateStream(ms, CompressionMode.Compress))
        {
            ds.Write(data, 0, data.Length);
            ds.Flush();
        }
        return ms.ToArray();
    }
}

在上面的函数中是否会关闭内存流? 或者将内存流分配给数组并返回数组更好吗?

public static byte[] Compress(byte[] data)
{
    byte[] compressedData;
    using (MemoryStream ms = new MemoryStream())
    {
        using (DeflateStream ds = new DeflateStream(ms, CompressionMode.Compress))
        {
            ds.Write(data, 0, data.Length);
            ds.Flush();                   
        }
        compressedData= ms.ToArray();
    }
    return compressedData;
}

哪些代码可以更好地优化内存使用?

4 个答案:

答案 0 :(得分:3)

我认为你可能正在走向过度优化的道路,但唉......

查看IL代码。很可能,它最终是相同的代码或非常相似。这是一个最优秀的微优化。

就个人而言,我会选择1作为可读性和更少的代码。

答案 1 :(得分:1)

MemoryStream将在两种情况下关闭。因此,代码的工作方式相同,因此第一个版本更好(因为它更短更清晰)。内存使用情况也是相同的,除了第二种情况下的额外附加引用变量compressedData,它将在方法退出后被销毁。

答案 2 :(得分:1)

非常相似的结果,不值得努力。

要回答你的问题,内存流会被关闭,因为它会留下范围并且处于一个使用块中,这意味着Dispose将被称为IDIpose模式。另外,我个人更喜欢你的第二个例子,因为它更容易在调试器中阻止它来检查compressedData的内容。但是,以性能为名进行重构真的不值得。

其他地方有更大的收获。

此处MemoryStream.toArray的示例代码如下所示

byte[] numArray = new byte[this._length - this._origin];
Buffer.InternalBlockCopy(this._buffer, this._origin, numArray, 0, this._length - this._origin);
return numArray;

流将被关闭的原因是因为它根本没有被你的代码保留,所有引用都被删除,因为流的内容被复制到一个数组。

内存流是这段代码

protected override void Dispose(bool disposing)
{
    try
    {
        if (disposing)
        {
            this._isOpen = false;
            this._writable = false;
            this._expandable = false;
        }
    }
    finally
    {
        base.Dispose(disposing); // ultimately this will dispose of the stream 
    }
}

答案 3 :(得分:0)

由于没有人提到它,我还要补充一点,不需要处理MemoryStream。关闭流可能会让人感到有些不适,但你可以放心,它绝对没有任何处理它,没有资源可以释放,等等。

当然,没有什么可以Flush,因为Flush是在写入底层流之前写入内部数组... MS没有其他地方可以写入内部缓冲区'stream',因此它总是被刷新。

像Albahari(Nutshell中的C#x.x)这样的引用也重复说MemoryStreams不需要处理。