Re: http://msdn.microsoft.com/en-us/library/system.io.file.exists.aspx
これが大規模な環境でサーバーのパフォーマンスに影響を与える可能性のある特に遅い操作またはロック操作であるかどうかは誰にもわかりませんか?
Re: http://msdn.microsoft.com/en-us/library/system.io.file.exists.aspx
これが大規模な環境でサーバーのパフォーマンスに影響を与える可能性のある特に遅い操作またはロック操作であるかどうかは誰にもわかりませんか?
コンピューティングでは、実際には「高価な操作」などというものはありません。ただし、それが何に関連して高価であるかを考慮しない限りです。
たとえば、現実の世界では、オブジェクトの $2.000.000 は高くつくでしょうか? バハマの価格だとしたら?その場合、高価になるでしょうか?牛乳のカートンはどうですか?それは高価ですか?
検討する必要があるのはFile.Exists
、実行しようとしている全体的な操作に関してコストがかかるかどうか、および実際に代替手段があるかどうかです。
代替品がない場合、高価かどうかは関係ありませんか?
たとえば、ファイルが存在するかどうかを 1 回確認し、存在する場合は、それをロードして処理に 1 時間費やした場合、費用がかかるとは見なされないと思います。
ただし、ファイルが存在するかどうかを確認するために 1 回のループで 10 回呼び出す場合、存在する場合は数値をインクリメントするだけで、そこで実行する 1 回の操作の中で最もコストがかかる可能性があります。
確実に知る唯一の方法は、メソッド呼び出しにかかる時間を実際に測定し、同じ操作で他のものと比較することです。
File.Exists
2016年にはそれほど高価ではないようであり、 と の間に実際の違いもないようですPathFileExists
(ファイルが存在しない場合に File.Exists() がはるかに遅いのはなぜですか? )。私が測定できる唯一の違いは、既存のファイルよりも存在しないファイルをチェックする方が速いということです。
(SSDでテスト済み)
[DllImport("Shlwapi.dll", SetLastError = true, CharSet = CharSet.Auto)]
private extern static bool PathFileExists(StringBuilder path);
void Main()
{
var sw = Stopwatch.StartNew();
for (int i = 0; i < 10000; i++)
{
File.Exists(@"c:\Home\Temp\test_.log");
}
sw.Stop();
sw.Dump("File.Exists = false");
sw = Stopwatch.StartNew();
for (int i = 0; i < 10000; i++)
{
File.Exists(@"c:\Home\Temp\test.log");
}
sw.Stop();
sw.Dump("File.Exists = true");
var sb = new StringBuilder(@"c:\Home\Temp\test_.log");
sw = Stopwatch.StartNew();
for (int i = 0; i < 10000; i++)
{
PathFileExists(sb);
}
sw.Stop();
sw.Dump("PathFileExists = false");
sb = new StringBuilder(@"c:\Home\Temp\test.log");
sw = Stopwatch.StartNew();
for (int i = 0; i < 10000; i++)
{
PathFileExists(sb);
}
sw.Stop();
sw.Dump("PathFileExists = true");
}
ロックなし。遅い、あなたがそれを比較しているものに依存します。I / Oに関してはかなり安価ですが、I / Oは一般的に、他の操作に比べて全体的に低速です。ですから、もしあなたがそれを使わなければならないのなら、それはそれほど悪くはありません。ただし、本当に必要以上に呼び出さないようにしています。:-)
私はそうではないと思います (ほとんどの OS では、ファイル操作が大幅に最適化され、キャッシュされています)。他のほとんどの操作が原因である可能性が高くなります (ソケット、DB アクセス、一般的な処理など)。ただし、いつものように、アプリケーションを実際にプロファイリングして、それがホットスポットかどうかを確認するのが最善の方法です。
ご使用の環境でいくつかのテストを実行するのが最善です。システムに支障をきたすことなく、1秒あたり10,000以上を実行できるアプリがあります。私はそれをかなり速いと思います。
File.Exisits
ファイルへの kernel32.dll FindFirstFile オープン ハンドラを使用します。結果のハンドルが無効な場合は、false を返します。有効な場合、LastAccessTime、CreationTime、ファイル サイズなどのすべてのものでデータ構造を埋めます。そして、true を返します。何もブロックしません。