DateTime.FromFileTime(fileTime).ToLocalTime().ToString()的更快替

本文关键字:ToLocalTime FromFileTime fileTime DateTime ToString | 更新日期: 2023-09-27 18:01:03

在分析我的应用程序时,我发现DateTime.FromFileTime(long fileTime(很慢。

有人知道快速管理的等价物或windows文件时间格式吗?

[编辑]我能够通过以下操作获得一些速度提升:

 var timeStr = FastTimeStringFormat(new DateTime(fileTime + 0x701ce1722770000L, DateTimeKind.Utc).ToLocalTime()); // + 0x701ce1722770000L is the offset needed to convert to UTC DateTime

为了提高速度但降低安全性(无日间夏令时检查(,您可以缓存ToLocalTime偏移量(长(,并省去更昂贵的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);
    }

DateTime.FromFileTime(fileTime).ToLocalTime().ToString()的更快替

DateTime.FromFileTime()在托管代码中实现,不涉及p/Invoke调用。

您正在经历的性能打击可能来自于内部执行的到本地时间的转换。如果可能的话,请尝试使用DateTime.FromFileTimeUtc((。