C# DateTime的默认时间精度是多少?

C# DateTime的默认时间精度是多少?,c#,datetime,precision,C#,Datetime,Precision,我在VisualStudio中为数据传输编写了一个小型winform程序,并使用了一种方法来提供传输持续时间。传输完成后,程序将返回一个对话框窗口以显示时间 但在这里我不知道计时器的时间精度或分辨率是多少,它怎么能达到这样的精度,甚至微秒 var startTime = DateTime.Now; this.transferdata(); var endTime = DateTime.Now; var timeElapsed = endTime.Subtract(startTime); 当我

我在VisualStudio中为数据传输编写了一个小型winform程序,并使用了一种方法来提供传输持续时间。传输完成后,程序将返回一个对话框窗口以显示时间

但在这里我不知道计时器的时间精度或分辨率是多少,它怎么能达到这样的精度,甚至微秒

var startTime = DateTime.Now;
this.transferdata();
var endTime = DateTime.Now;
var timeElapsed = endTime.Subtract(startTime);


当我看到类DateTime的定义时,精度只有毫秒。有人能告诉我为什么VisualStudio2012中有这么高分辨率的计时器吗?或者与操作系统有关?

时钟的精度取决于操作系统。系统时钟以每秒一定的次数滴答作响,您只能测量整个滴答作响

您可以使用以下代码测试特定计算机的分辨率:

DateTime t1 = DateTime.Now;
DateTime t2;
while ((t2 = DateTime.Now) == t1) ;
Console.WriteLine(t2 - t1);
在我的计算机上,结果是
00:00:00.0156253
,这意味着系统时钟每秒跳动64次

(注意:
DateTime
类型也有滴答声,但这与系统时钟滴答声不同。
DateTime
滴答声为1/10000000秒。)

要更精确地测量时间,应使用
秒表
类。其分辨率也取决于系统,但远高于系统时钟。您可以从
Stopwatch.Frequency
属性中获得分辨率,在我的计算机上,它返回
2143566
,比64稍高一点

工作前启动秒表,工作后停止,然后获取经过的时间:

Stopwatch time = Stopwatch.StartNew();
this.transferdata();
time.Stop();
TimeSpan timeElapsed = time.Elapsed;
这将返回
TimeSpan
类型可以处理的分辨率中的时间,例如1/10000000秒。您还可以根据刻度数计算时间:

double timeElapsed = (double)s.ElapsedTicks / (double)Stopwatch.Frequency;

你混淆了几件事。精度、准确度、频率和分辨率

您可能有一个精确到十亿位小数的变量。但是如果你不能真正测量一个很小的数字,那么这就是精度和分辨率之间的区别。频率是每秒进行测量的次数,与分辨率有关。准确度是指给定样本与实际测量值的接近程度

因此,鉴于DateTime的精度远远高于系统时钟,只需简单地说DateTime。现在不一定会给出准确的时间戳。然而,Windows中有更高分辨率的计时器,Stopwatch类使用它们来测量经过的时间,因此如果使用该类,您将获得更好的精度


DateTime没有“默认精度”。它只有一个精度,这就是它可以存储的最小值和最大值。DateTime在内部将其值存储为单个值,并且该值被格式化为您想要显示的任何类型(秒、分钟、天、刻度等等)

DateTime的精度和准确度:(“拥有如此高的精度所产生的问题当然是,很容易假设给定的值与它的精度一样准确。但这根本不是保证的!”)1。这与Visual Studio无关。正是.NET框架在做这件事,在它的掩护下,它进入了Windows。2.您可以使用
秒表
类型-它可能更精确一点,但Windows中似乎不存在您期望的“现在几点了”的精度级别。
DateTime
的精度可以降到刻度,而不是毫秒。(一微秒中有10个刻度。)这样想吧——仅仅因为
DateTime
变量可以存储很多小数位,并不意味着内部系统时钟使用所有小数位。此外,永远不要使用
DateTime。现在
为此,请使用
DateTime.UtcNow
或最好是
秒表
。这里需要注意的一点是,由于Windows不是实时操作系统,您可能会有其他东西突然占用CPU一段时间,同时增加测量的数字。我会运行一系列这样的测试并选择最低的数字,除非有更确定的方法来获得实际的刻度大小。@Guffa-您的“测试”不准确,因为操作系统可能会在“while”循环中从您的进程中切换,而这一时间可能比DateTime的实际分辨率更长。@LasseV.Karlsen:是的,运行测试比wise更明智当然是明智的。@ErikFunkenbusch:也许我不清楚,但该测试当然不是用来一次性测量系统时钟的。这是一个简单的测试,测试系统时钟,但是你当然应该不止一次地运行它来获得一个特定的结果。考虑使用<代码> DATETIME。UtcNow < /代码>。代码>日期时间。现在速度较慢,因为它必须进行时区转换。另外,如果您使用
DateTime.Now
并跨越夏令时转换,您将得到意外的结果: