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

时间:2014-08-16 21:07:27

标签: c# datetime precision

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

但是在这里我不知道计时器的时间精度或分辨率是多少,如何才能达到如此精确,甚至微秒?

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

enter image description here

当我看到DateTime类的定义时,只有精度以毫秒为单位。任何人都可以告诉我为什么在visual studio 2012中有这么高分辨率的计时器?或者与操作系统有关系?

2 个答案:

答案 0 :(得分:6)

时钟的精度取决于操作系统。系统时钟每秒记录一定次数,您只能测量整个刻度。

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

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类。它的分辨率还取决于系统,但远高于系统时钟。你可以从Stopwatch.Frequency属性中获得分辨率,并在我的计算机上返回{{1>},其中多于而不是64 ...

在工作前启动秒表并在之后停止,然后获取已用时间:

2143566

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

TimeSpan

答案 1 :(得分:3)

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

您可能有一个精确到十亿个小数位的变量。但是,如果你无法实际测量那么小的数字那么精确度和分辨率之间的差异。频率是每秒进行测量的次数,而与分辨率有关。准确度是给定样本与实际测量的接近程度。

因此,鉴于DateTime的精度远高于系统时钟,只需说DateTime.Now就不一定能给你一个确切的时间戳。但是,在Windows中有更高分辨率的计时器,而秒表类使用它们来测量经过的时间,所以如果你使用这个类,你会得到更好的准确性。

DateTime没有"默认精度"。它只有一个精度,它可以存储的最小值和最大值。 DateTime在内部将其值存储为单个值,并将此值格式化为您要显示的任何类型(秒,分钟,天,刻度,等等......)。

相关问题