Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 更快地替代DateTime.FromFileTime(fileTime).ToLocalTime().ToString())_C#_Datetime - Fatal编程技术网

C# 更快地替代DateTime.FromFileTime(fileTime).ToLocalTime().ToString())

C# 更快地替代DateTime.FromFileTime(fileTime).ToLocalTime().ToString()),c#,datetime,C#,Datetime,在分析我的应用程序时,我发现DateTime.FromFileTime(长文件时间)很慢 有人知道fast管理的等效格式或windows文件时间格式吗 [编辑] 通过以下操作,我可以获得一些速度增益: var timeStr = FastTimeStringFormat(new DateTime(fileTime + 0x701ce1722770000L, DateTimeKind.Utc).ToLocalTime()); // + 0x701ce1722770000L is the offs

在分析我的应用程序时,我发现DateTime.FromFileTime(长文件时间)很慢

有人知道fast管理的等效格式或windows文件时间格式吗

[编辑] 通过以下操作,我可以获得一些速度增益:

 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);

    }

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


您所经历的性能冲击可能来自内部执行的本地时间转换。如果可能的话,试着改用。

+1这确实会让它快一点。我很惊讶这个电话这么贵。