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, проверьте, существует ли файл, а затем, если он это делает, вы загрузите его и потратите на его обработку час, тогда я бы предположил, что это не будет считаться дорогостоящим.
Однако, если вы вызываете его 10 раз в одном цикле, чтобы выяснить, существует ли файл, а затем, если это так, просто увеличивайте число, то это может быть самая дорогая одиночная операция, которую вы там делаете.
Единственный способ, которым вы можете точно знать, - это фактически измерить, сколько времени занимает этот вызов метода, по сравнению с тем, что еще вы делали в той же операции.
Я не думаю, что это (операции с файлами сильно оптимизированы и кэшируются на большинстве ОС), и большинство других операций, скорее всего, будут виновниками здесь (сокеты, доступ к БД, общая обработка и т.д.). Но, как обычно, лучший способ - это профилировать ваше приложение и посмотреть, является ли он точкой доступа.
В 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");
}
Лучше всего было бы запустить несколько тестов в вашей среде. У меня есть приложение, которое может делать 10 000+ в секунду без икоты для моих систем. Я считаю это довольно быстрым.
File.Exisits
с открытым файлом kernel32.dll FindFirstFile для файла. Если результирующий дескриптор недействителен, он возвращает false. Если он действителен, он заполняет структуру данных всеми вещами, такими как LastAccessTime, CreationTime, размер файла и т.д. И затем верните истину. Ничто не блокирует.