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

非常によく似た結果であり、努力する価値はありません。

あなたの質問に答えるには、スコープを離れて 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 に答える
1

The MemoryStream will be closed in both cases. Thus, the code works identical, so the first version is better (since it's shorter and more clear). Memory usage is also identical, except additional additional reference variable compressedData in second case, which will be destroyed after method exit.

于 2012-04-05T02:05:24.720 に答える
0

誰も言及していないので、MemoryStream を破棄する必要がないことも付け加えておきます。ストリームを閉じないのは間違っていると感じる人もいるかもしれませんが、安心してください。Dispose を実行しても何も起こらず、解放するリソースもありません。

そしてもちろん、フラッシュするものは何もありません。フラッシュは、基になるストリームに書き込む前に内部配列に書き込むことに関するものです... MSには、内部バッファーの「ストリーム」以外に書き込む場所がないため、常にフラッシュされます。

Albahari (一言で言えば C# xx) のような参照も、MemoryStreams を破棄する必要がないことを繰り返します。

于 2012-04-05T03:45:49.323 に答える