Ответ 1
Не беспокойтесь об этом. Во-первых, выделение в .NET дешево. Во-вторых, этот объект будет в гене 0, поэтому он должен быть собран без особых накладных расходов.
Я знаю, что обычным способом получения размера файла было бы использование экземпляра FileInfo:
using System.IO;
class SizeGetter
{
public static long GetFileSize(string filename)
{
FileInfo fi = new FileInfo(filename);
return fi.Length;
}
}
Есть ли способ сделать то же самое, не создавая экземпляр FileInfo, используя статический метод?
Возможно, я пытаюсь быть слишком скупым, создавая новый экземпляр каждый раз, когда хочу размер файла, но, например, попробую рассчитать общий размер каталога, содержащего 5000+ файлов. Как оптимизировано, как может быть GC, не должно быть способа сделать это без необходимости излишнего налогообложения?
Не беспокойтесь об этом. Во-первых, выделение в .NET дешево. Во-вторых, этот объект будет в гене 0, поэтому он должен быть собран без особых накладных расходов.
Не беспокойтесь об этом.
Я нашел сообщение в блоге о ком-то, кто измерил накладные расходы на создание объектов в .NET(С# Object Creation Time Trials), и, как оказалось, создание 10 000 объектов заняло 0,03 секунды, т.е. 3 мкс на объект. Время, необходимое для чтения длины файла из файловой системы, несомненно, будет доминировать над этими 3 микросекундами.
Множество статических методов в среде .NET внутренне создает объекты и вызывает методы экземпляров экземпляров (вы можете проверить это, посмотрев на источник ссылки или используя инструмент отражения). Вы предполагаете, что статический метод выполняется быстрее. Не делайте таких предположений. Если у вас есть два способа сделать то же самое, измерьте, какой из них быстрее.
Если вам действительно нужен статический метод, используйте собственный GetFileSize
или GetFileSizeEx
. Но имейте в виду, что для этого потребуется дескриптор файла из API CreateFile
.
Вы также можете просмотреть источник класса FileInfo
:
http://referencesource.microsoft.com/#mscorlib/system/io/fileinfo.cs#4ee673c1a4ecad41