为什么TimeSpan用100ns“滴答”构建?

时间:2012-06-29 20:38:05

标签: .net timespan

可以使用天,小时,分钟,秒和毫秒构建TimeSpan类:

public TimeSpan(int hours, int minutes, int seconds);
public TimeSpan(int days, int hours, int minutes, int seconds);
public TimeSpan(int days, int hours, int minutes, int seconds, int milliseconds);

它也可以用“滴答”构成,它是100纳秒的时间单位:

public TimeSpan(long ticks);

当许多其他与时间相关的对象(例如System.Timers.Timer.Interval)基于毫秒单位时,100纳秒的意义是什么?另外,为什么不使用微秒,这是10倍长,但更常见的时间单位?

3 个答案:

答案 0 :(得分:3)

因为Wintel计算机基于使用100ns滴答的硬件时钟。

答案 1 :(得分:2)

这是clunk,是[Open] VMS中使用的时间单位。

答案 2 :(得分:2)

除非您自己参与决策,否则回答“为什么”问题并不容易。据说HABO的回答(Dave Cutler参与了VMS和Windows NT的设计),这可以说是100 ns,很可能是来自VMS的灵感。

但是,由于您希望将时间跨度拟合为有符号的64位数字,因此使用100 ns作为刻度值是有意义的。最大的时间跨度(TimeSpan.MaxValue)是

0x7FFF FFFF FFFF FFFF ticks
  = 9 223 372 036 854 775 807 ticks
  = 9 223 372 036 854 775 807 ticks / 10 000 000 ticks/s
  = 922 337 203 685 s
  ~ 30 000 years

不同的刻度值会导致不同的最大时间跨度:

Ticks  | Max time span (approx.)
-------+------------------------
 10 ns |   3 000 years
100 ns |  30 000 years
  1 μs | 300 000 years

忽略DateTime.Kind DateTime值基本上距离纪元01-01-0001 00:00:00(TimeSpan)的DateTime.MinValue偏移量,因此100 ns刻度你可以容纳31-12-9999 23:59:59(DateTime.MaxValue)的日期。如果您在3000年之前用完蜱,那么这将是不可能的。在1年的时间内,您可以将时间分辨率降低10倍而不会得到任何关于日期表示的任何回报,假设10000年是第一年“你不在乎”。

考虑到这一点,似乎使用带符号的64位值,仍然允许您表示所有4位数年份的最小刻度值为100 ns。

(如果你认为2000年的问题对IT行业来说很难,只需要等待10000年的问题。)