2016-10-26 9 views
0

私のプログラムはファイルからxバイトを読み込み、それらがすべて0であるかどうかをチェックし、20.000ファイルのプロセスを繰り返し、ゼロ以外のバイトを持つファイルのリストを保持します。 パフォーマンスを監視しようとすると、定義可能な各ファイル(バイトサイズ)に対してチェックするバイト数を作成しました。最初の実行後にBinaryReaderが30倍高速になりました。バイト配列はまだメモリにありますか?

問題は、プログラムの最初の実行で完了までに5分(byteSize = 8192)かかりますが、プログラムを閉じて再起動しても10秒しかかかりませんが、だから私の心に来る唯一の原因は、バイト配列がメモリに残っていることです。

BinaryReaderは "using"ディレクティブの下にあります。つまり、ループが完了した後でストリームを閉じる必要があることがわかっている限りです。なぜバイト配列が残っているのですか?どうすれば削除できますか?私はprogを実行するたびに実際のパフォーマンスを測定するためにそれを行う必要があります。

byte[] readByte = new byte[byteSize]; 

for (int i = 0; i < readCycles; i++) 
{ 
    using (BinaryReader reader = new BinaryReader(new FileStream(file, FileMode.Open, FileAccess.Read))) 
    { 
     reader.BaseStream.Seek(8192 + i * byteSize, SeekOrigin.Begin); 
     reader.Read(readByte, 0, byteSize); 
    } 

    foreach (byte b in readByte) 
    { 
     if (b != 0) 
     { 
      allZeros = false; 
      break; 
     } 
     else 
      allZeros = true; 
    } 

    if (allZeros == false) break; 
} 
+1

プロセスを再起動した後、アプリケーションによってバイト配列がそのように回復可能な方法はありません。おそらくあなたが経験しているのは、オペレーティングシステムのファイルキャッシュです。 – itsme86

+1

*配列*はメモリに残っていません(これはプロセスの再起動には影響しませんが、*ファイル*の内容は変わりません)。 Windowsには、そのようなもののための独自のファイルシステムキャッシュがあります。実行するたびに新しいファイルを作成すると、それが解決されます。 –

答えて

4

これは、.NETがやっていることとはまったく関係がありません。透過的にキャッシュするファイルシステムになります。これをテストする

、単にバッファにそれを読み、データを無視して、ファイル上FileStreamと単純にループを使用するようにコードを変更します。

using (var stream = File.OpenRead(...)) 
{ 
    var buffer = new byte[16384]; 
    while (stream.Read(buffer, 0, buffer.Length) > 0) 
    { 
    } 
} 

私はあなたが同じ結果が表示されます確信しています - 最初の読書は比較的遅く、それは非常に速くなるでしょう。

+1

別の方法で確認:OSキャッシュをクリアするためにSysInternalの[RAMMap](http://technet.microsoft.com/en-us/sysinternals/ff700229.aspx)を使用しました。速度は最初に戻っています。 http://stackoverflow.com/questions/478340/clear-file-cache-to-repeat-performance-testing –

関連する問題