2012-04-05 23 views
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(); 
    } 
} 

memorystreamを上記の関数で閉じますか? または、memorystreamを配列に代入して代わりに配列を返す方が良いですか?メモリ使用量を最適化する

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; 
} 

どのコードがメモリ使用を最適化していますか?

+5

男、コードではなくコードです!畜生! http://english.stackexchange.com/questions/20455/is-it-wrong-to-use-the-word-codes-in-a-programming-context –

+0

オプション1はよりクリーンであり、より良い(1つのref-variable less )答えが指摘するように。加えて、ds.Flush()でフラッシュする必要はありません。 'using'はストリームを閉じます(そして閉じる前にclose flushes) – mho

+1

Alright Vlad ..コード:D – xaria

答えて

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 
    } 
} 
1

MemoryStreamはどちらの場合も閉じます。したがって、コードは同じように動作するので、最初のバージョンがより優れています(より短く、より明確です)。メモリ使用量も同じですが、追加の参照変数compressedDataは2番目の場合に追加され、メソッド終了後に破棄されます。

3

私はあなたが過剰な最適化への道上にあってもよいと思うが、ILコードで、悲しいかな...

ルック。おそらく、それは同じコードまたは非常に似ていることになります。これは最高のマイクロ最適化です。

個人的には、私は可読性とコードが少ないためオプション1を使用します。

0

で、私はまた、MemoryStreamをを配置する必要がないことを追加します。ストリームを閉じるのではなく、気分を悪くするかもしれませんが、あなたは安心しておくことができます。それを廃棄することは絶対にありません。また、解放するリソースもありません。

もちろんFlushは内部の配列に書き込んでから基本のストリームに書き込むため、何もありません... MSはどこにでも書き込むことはできませんが、内部のバッファ 'ストリーム'にはありませんフラッシュ。

また、Albahari(C#x.x in Nutshell)のような参考文献では、MemoryStreamを削除する必要はありません。

関連する問題