我在Visual Studio中为数据传输做了一个小的winform程序,我使用了一种方法来提供传输持续时间。传输完成后,程序将返回一个对话窗口以显示时间。
但是在这里我不知道计时器的时间精度或分辨率是多少,如何才能达到如此精确,甚至微秒?
var startTime = DateTime.Now;
this.transferdata();
var endTime = DateTime.Now;
var timeElapsed = endTime.Subtract(startTime);
当我看到DateTime类的定义时,只有精度以毫秒为单位。任何人都可以告诉我为什么在visual studio 2012中有这么高分辨率的计时器?或者与操作系统有关系?
答案 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在内部将其值存储为单个值,并将此值格式化为您要显示的任何类型(秒,分钟,天,刻度,等等......)。