4

ASP.Net のカスタム ハンドラーを使用してクライアントにファイルを書き戻したいのですが、処理時間を最小限に抑える最善の方法は何かを考えています。現時点では、同じことを行う 2 つの異なるバージョンのコードがありますが、ハンドラーが頻繁に使用されるため、どの方法が最も効率的かを考えています。

完全なファイルをバイト配列にロードし、BinaryWriteファイルの書き込みに使用します。

string filePath = context.Server.MapPath(context.Request.Url.LocalPath);
Byte[] swfFile = File.ReadAllBytes(filePath);
context.Response.AppendHeader("content-length", Utils.MakeString(swfFile.Length));
context.Response.ContentType = Utils.GetMimeType(Path.GetExtension(filePath));
context.Response.BinaryWrite(swfFile);

FileInfoオブジェクトを使用してファイルの長さを決定し、ファイルTransmitFileを書き込む:

string filePath = context.Server.MapPath(context.Request.Url.LocalPath);
FileInfo fileInfo = new FileInfo(filePath);
context.Response.AppendHeader("content-length", Utils.MakeString(fileInfo.Length));
context.Response.ContentType = Utils.GetMimeType(Path.GetExtension(filePath));
context.Response.TransmitFile(filePath);

TransmitFileファイルをバッファリングせずに書き込むため、この方法が最も効率的であると思います。FileInfoオブジェクトはどうですか?ファイルサイズはどのように計算されますか? そして、FileInfoオブジェクトはこれを行うための最良の方法ですか、それともより良い方法がありますか?

4

1 に答える 1

5

FileInfoファイルシステムにファイルサイズ情報を要求します(もちろん、すべてのコンテンツを読み取る必要はありません)。これは通常、ディスクにヒットするため、(メモリ内のものを操作したりメソッドを呼び出したりするのに比べて) 「高価な」操作と見なされます。

ただし、ディスク アクセスを削減することは良いことですが、とにかくファイルの内容全体を読み取る準備をしている場合、これは大まかなスキームに違いをもたらしません。ですから、FileInfo注目すべきはそれ自体のパフォーマンスです。

ここでの最大のパフォーマンスの問題は、最初のアプローチで、クライアントがファイルをダウンロードする間、ファイル全体がメモリに保持されることです。これは、(ファイルのサイズとクライアント接続) アプリケーションのメモリ使用量が大幅に増加する可能性があります。そして、このメモリ使用量の増加がスワッピング (つまり、ディスクへのヒット) につながると、パフォーマンスは即座に低下します。

したがって、使用する必要があるのはTransmitFile、ディスクへのアクセスが高速だからではなく (そうである場合とそうでない場合があります)、メモリの使用量が少ないためです。

于 2013-03-13T12:23:41.117 に答える