gpt4 book ai didi

c# - Environment.TickCount 与 DateTime.Now

转载 作者:IT王子 更新时间:2023-10-29 03:44:34 26 4
gpt4 key购买 nike

是否可以使用 Environment.TickCount 来计算时间跨度?

int start = Environment.TickCount;
// Do stuff
int duration = Environment.TickCount - start;
Console.WriteLine("That took " + duration " ms");

因为 TickCount 已签名并将在 25 天后滚动(需要 50 天才能达到所有 32 位,但如果您想对数学有任何意义,则必须废弃已签名的位) ,似乎风险太大而无法使用。

我正在使用 DateTime.Now。这是最好的方法吗?

DateTime start = DateTime.Now;
// Do stuff
TimeSpan duration = DateTime.Now - start;
Console.WriteLine("That took " + duration.TotalMilliseconds + " ms");

最佳答案

Environment.TickCount 基于 GetTickCount() WinAPI 函数。以毫秒为单位但它的实际精度约为15.6 ms。所以你不能测量更短的时间间隔(否则你会得到 0)

注意:返回的值为 Int32,因此该计数器每 ~49.7 天滚动一次。你不应该用它来测量这么长的间隔。

DateTime.Ticks 基于 GetSystemTimeAsFileTime () WinAPI函数。它以 100 纳秒(微秒的十分之一)为单位。DateTime.Ticks 的实际精度取决于系统。在 XP 上,系统时钟的增量约为 15.6 ms,与 Environment.TickCount 相同。在 Windows 7 上,它的精度是 1 毫秒(而 Environemnt.TickCount 仍然是 15.6 毫秒),但是如果使用节能方案(通常在笔记本电脑上),它也可以下降到 15.6 毫秒。

秒表 基于 QueryPerformanceCounter() WinAPI 函数(但如果您的系统不支持高分辨率性能计数器,则使用 DateTime.Ticks)

在使用 StopWatch 之前注意两个问题:

  • 它在多处理器系统上可能不可靠(参见 MS kb895980kb896256)
  • 如果 CPU 频率变化,它可能不可靠(阅读 this 文章)

您可以通过简单的测试来评估系统的精度:

static void Main(string[] args)
{
int xcnt = 0;
long xdelta, xstart;
xstart = DateTime.UtcNow.Ticks;
do {
xdelta = DateTime.UtcNow.Ticks - xstart;
xcnt++;
} while (xdelta == 0);

Console.WriteLine("DateTime:\t{0} ms, in {1} cycles", xdelta / (10000.0), xcnt);

int ycnt = 0, ystart;
long ydelta;
ystart = Environment.TickCount;
do {
ydelta = Environment.TickCount - ystart;
ycnt++;
} while (ydelta == 0);

Console.WriteLine("Environment:\t{0} ms, in {1} cycles ", ydelta, ycnt);


Stopwatch sw = new Stopwatch();
int zcnt = 0;
long zstart, zdelta;

sw.Start();
zstart = sw.ElapsedTicks; // This minimizes the difference (opposed to just using 0)
do {
zdelta = sw.ElapsedTicks - zstart;
zcnt++;
} while (zdelta == 0);
sw.Stop();

Console.WriteLine("StopWatch:\t{0} ms, in {1} cycles", (zdelta * 1000.0) / Stopwatch.Frequency, zcnt);
Console.ReadKey();
}

关于c# - Environment.TickCount 与 DateTime.Now,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/243351/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com