При профилировании моего приложения я обнаружил, что DateTime.FromFileTime (long fileTime) работает медленно.
Кто-нибудь знает быстрый управляемый эквивалент или формат времени файла Windows?
[EDIT]
Я смог добиться некоторого прироста скорости, выполнив следующее:
var timeStr = FastTimeStringFormat(new DateTime(fileTime + 0x701ce1722770000L, DateTimeKind.Utc).ToLocalTime()); // + 0x701ce1722770000L is the offset needed to convert to UTC DateTime
Для большей скорости, но меньшей безопасности (без проверок перехода на летнее время в течение дня) вы можете кэшировать смещение ToLocalTime (long) и сэкономить более дорогой дорогой вызов ToLocalTime ().
При запуске приложения:
long fileTimeOffset = DateTime.Today.Subtract(DateTime.Today.ToUniversalTime()).Ticks + 0x701ce1722770000L;
Тогда на вашем критическом пути:
var timeStr = FastTimeStringFormat(new DateTime(fileTime + fileTimeOffset));
Как оказалось, ToString очень дорогой, а следующий - быстрее.
public static unsafe string FastTimeStringFormat(DateTime time)
{
// modified version from the following post:
// http://geekswithblogs.net/akraus1/archive/2006/04/23/76146.aspx
// this one is also more accurate because of true divide by 10, beware of less accurate versions that do not use division
char* FixedCharArray = stackalloc char[13];
int hour = time.Hour; // Cache property values
int minute = time.Minute;
int second = time.Second;
int ms = time.Millisecond;
// hour
FixedCharArray[0] = (Char)('0' + hour / 10);
FixedCharArray[1] = (Char)('0' + hour % 10);
FixedCharArray[2] = ':';
// minute
FixedCharArray[3] = (Char)('0' + minute / 10);
FixedCharArray[4] = (Char)('0' + minute % 10);
FixedCharArray[5] = ':';
// seconds
FixedCharArray[6] = (Char)('0' + second / 10);
FixedCharArray[7] = (Char)('0' + second % 10);
FixedCharArray[8] = '.';
// miliseconds
FixedCharArray[9] = (Char)('0' + ms / 100);
FixedCharArray[10] = (Char)('0' + ms % 100 / 10);
FixedCharArray[11] = (Char)('0' + ms % 10);
return new String(FixedCharArray);
}