Более быстрая альтернатива DateTime.FromFileTime (fileTime) .ToLocalTime (). ToString () - PullRequest
0 голосов
/ 05 июля 2011

При профилировании моего приложения я обнаружил, что 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);

    }

1 Ответ

2 голосов
/ 05 июля 2011

DateTime.FromFileTime() реализовано в управляемом коде, вызовы P / Invoke не задействованы.

Падение производительности, которое вы испытываете, может быть вызвано преобразованием в местное время, которое выполняется внутри компании.Попробуйте вместо этого использовать DateTime.FromFileTimeUtc () , если это вообще возможно.

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