1

我有一个带有中断的 C# 程序,它处理我希望每 40 毫秒运行一次的列表的一部分,但是中断内的数学运算可以冻结具有某些大小和属性的列表的程序。

我很想尝试通过从数学中删除 TimeSpan 加减并在执行算术之前而不是之后将它们全部转换为 TotalMilliseconds 来加速它。有谁知道与获取 TotalMilliseconds 并添加和减去 TimeSpan 相比,添加和减去 TimeSpan 的开销是多少?

谢谢。

4

1 回答 1

11

这是不明智的,Timespan.TotalMilliseconds 是double类型的属性,单位为一毫秒。Ticks 与底层结构值高度无关,是long类型的底层字段的属性获取器,单位为 100 纳秒。TotalMilliseconds 属性 getter 通过一些技巧将 long 转换为 double,它确保来回转换产生相同的数字。

这对 TimeSpan 来说是个问题,它可以覆盖 10,000 年,精度为 100 纳秒。然而,双精度数有 15 位有效数字,这不足以以这种精度涵盖那么多年。TotalMilliseconds 属性执行舍入,而不仅仅是转换,它确保返回值精确到一毫秒。不是 100 纳秒。所以来回转换它总是产生相同的值。

哪个有效:10,000 年 x 365.4 天 x 24 小时 x 60 分钟 x 60 秒 x 1000 毫秒 = 315,705,600,000,000 毫秒。数一下数字,正好是 15,所以正好可以存储在一个 double 中而不会损失准确性。快乐的巧合,不是吗?

回答这个问题:如果你关心速度,那么总是使用 Ticks,而不是 TotalMilliseconds。这是一个非常快的 64 位整数运算。 比整数到浮点+舍入转换快得多

于 2012-06-11T23:23:40.053 回答