Подтвердить что ты не робот

Является ли File.Exists дорогостоящей операцией?

Re: http://msdn.microsoft.com/en-us/library/system.io.file.exists.aspx

Кто-нибудь знает, является ли это особенно медленной или блокирующей операцией, которая может повлиять на производительность сервера в большой среде?

4b9b3361

Ответ 1

Номер блокировки. Медленно, зависит от того, с чем вы сравниваете. Это довольно дешево по мере ввода-вывода, но ввод-вывод в целом медленный по сравнению с другими операциями. Итак, если вы должны использовать его, это не повредит слишком плохо. Тем не менее, я постараюсь не называть его больше раз, чем это действительно необходимо!: -)

Ответ 2

В вычислениях на самом деле нет такой вещи, как "дорогая операция", если вы не рассмотрите, что это дорого по отношению к.

Например, в реальном мире было бы стоить $2.000.000 для объекта дорого? Что, если это цена Багамских островов? Было бы дорого? Как насчет коробки с молоком? Это дорого?

Что нужно учитывать, если File.Exists является дорогостоящим с точки зрения общей операции, которую вы намереваетесь делать, и есть ли у вас какие-либо альтернативы.

Если у вас нет альтернатив, важно ли это дорого или нет?

Например, если вы выполните 1, проверьте, существует ли файл, а затем, если он это делает, вы загрузите его и потратите на его обработку час, тогда я бы предположил, что это не будет считаться дорогостоящим.

Однако, если вы вызываете его 10 раз в одном цикле, чтобы выяснить, существует ли файл, а затем, если это так, просто увеличивайте число, то это может быть самая дорогая одиночная операция, которую вы там делаете.

Единственный способ, которым вы можете точно знать, - это фактически измерить, сколько времени занимает этот вызов метода, по сравнению с тем, что еще вы делали в той же операции.

Ответ 3

Я не думаю, что это (операции с файлами сильно оптимизированы и кэшируются на большинстве ОС), и большинство других операций, скорее всего, будут виновниками здесь (сокеты, доступ к БД, общая обработка и т.д.). Но, как обычно, лучший способ - это профилировать ваше приложение и посмотреть, является ли он точкой доступа.

Ответ 4

В 2016 году это выглядит не очень дорого, и, похоже, нет никакой реальной разницы между File.Exists и 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");

}

Результаты

Ответ 5

Лучше всего было бы запустить несколько тестов в вашей среде. У меня есть приложение, которое может делать 10 000+ в секунду без икоты для моих систем. Я считаю это довольно быстрым.

Ответ 6

File.Exisits с открытым файлом kernel32.dll FindFirstFile для файла. Если результирующий дескриптор недействителен, он возвращает false. Если он действителен, он заполняет структуру данных всеми вещами, такими как LastAccessTime, CreationTime, размер файла и т.д. И затем верните истину. Ничто не блокирует.