0
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

4 回答 4

3

我认为您可能正在过度优化,但是唉...

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

就个人而言,我会选择选项 1 以提高可读性和更少的代码。

于 2012-04-05T02:07:28.203 回答
1

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

于 2012-04-05T02:05:24.720 回答
1

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

为了回答您的问题,内存流被关闭,因为它离开了范围并且处于 using 块中,这意味着 Dispose 将被称为 IDispose 模式。顺便说一句,我个人更喜欢您的第二个示例,因为它更容易在调试器中停止它以检查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 
    }
}
于 2012-04-05T02:11:05.943 回答
0

由于没有人提到它,我还要补充一点,MemoryStream 不需要被释放。不关闭流可能会让一些人觉得不对,但你可以放心,它绝对不会对它进行 Dispose,没有要释放的资源等等。

当然,Flush 也没有任何内容,因为 Flush 是在写入底层流之前写入内部数组...... MS 除了写入内部缓冲区“流”之外别无他法,所以它总是被刷新。

像 Albahari (C# xx in a Nutshell) 之类的引用也重复说 MemoryStreams 不需要处置。

于 2012-04-05T03:45:49.323 回答