优化内存使用
本文关键字:内存 优化 | 更新日期: 2023-09-27 18:29:58
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;
}
哪个代码可以更好地优化内存使用?
我认为您可能正在过度优化的道路上,但唉......
查看 IL 代码。 很可能,它最终是相同的代码或非常相似的代码。 这是最好的微优化。
就个人而言,我会选择选项 1 以提高可读性和更少的代码。
非常相似的结果,不值得付出努力。
为了回答您的问题,内存流被关闭,因为它离开了范围并且处于使用块中,这意味着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
}
}
在这两种情况下,MemoryStream
都将关闭。因此,代码的工作方式相同,因此第一个版本更好(因为它更短,更清晰(。内存使用情况也是相同的,除了在第二种情况下compressedData
额外的附加引用变量,这些变量将在方法退出后销毁。
由于没有人提到它,我还要补充一点,MemoryStream不需要被释放。不关闭流可能会让一些人感到不对,但你可以放心,它绝对不会处理它,没有资源可以释放,等等。
当然,Flush也没有什么可做的,因为Flush是在写入底层流之前写入内部数组的......MS 除了写入内部缓冲区"流"之外无处可写,因此它总是被刷新。
像Albahari(简而言之是C# x.x(这样的引用也重复了MemoryStreams不需要处置。