2016-09-30 2 views
1

внесения некоторых изменений в приложение, которое я унаследовал, и во многих местах исходного код использует это, чтобы получить имя файла без пути:Стоит ли заменить FileInfo.Name() на Path.GetFileName()?

string filename = "C:\path\to\abc.xyz"; 
FileInfo fi = new FileInfo(filename); 
string newfilename = Path.Combine(otherpath, fi.Name); 

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

Это не приложение в режиме реального времени, но его производительность важна. Я все еще изучаю .NET framework и C# и вижу, что создание объектов FileInfo и DirectoryInfo имеет некоторые накладные расходы, которые во время выполнения зависят от нагрузки ОС в ОС.

Мой первый шаг был превратить это в:

string newfilename = Path.Combine(otherpath, Path.GetFileName(filename)); 

Есть десятки строк, в которых используется тот же исходный код. Является ли моя озабоченность по поводу того, что этот код зависит от ИО, и я исправлю в предположении, что мои изменения устранили бы эту зависимость?

+3

Ничего себе, уже некоторые ненавидят. Что с тобой, люди? – ajeh

+0

_Impressions_ можно легко подтвердить или опровергнуть, если вы _measure_ – Steve

+1

^перевод: почему бы вам не попробовать в обоих направлениях и запустить несколько тестов, чтобы узнать, какой из них требуется больше времени? –

ответ

1

Стоит ли заменить FileInfo.Name() на Path.GetFileName()?

Вы должны будете судить об этом на основании вашего заявления. Мы не знаем, сколько раз эти вызовы происходят в ваших критических путях, и если выигрыш в производительности стоит какой-либо выгоды.

Является ли мое беспокойство по поводу этого кода зависимым от ИО, и я исправлю в предположении, что мое изменение устранит эту зависимость?

Использования Fileinfo лучше, чем при использовании эквивалентного File метода при создании более одного вызова, который нуждается в stat, так как информация stat будет кэшировать в FileInfo объекте с первым вызовом. В вашем случае вы не делаете никаких stat, поэтому накладных расходов «ввода-вывода» нет. Но когда вы используете FileInfo, он выполнит некоторые проверки безопасности (доступ к реестру, загрузка dll и т. Д.), Поэтому у вас будут эти накладные расходы. Path.GetFileName - довольно абстракция для манипуляций с строкой, поэтому у нее нет таких накладных расходов и будет быстрее.

Если бы я был вами, и у меня была роскошь и время, чтобы внести изменения с FileInfo, позвоните в Path.GetFileName, я бы сделал это. Для меня (и это субъективно), звонок Path.GetFileName много «чище»

Смежные вопросы