我有一个带有中断的 C# 程序,它处理我希望每 40 毫秒运行一次的列表的一部分,但是中断内的数学运算可以冻结具有某些大小和属性的列表的程序。
我很想尝试通过从数学中删除 TimeSpan 加减并在执行算术之前而不是之后将它们全部转换为 TotalMilliseconds 来加速它。有谁知道与获取 TotalMilliseconds 并添加和减去 TimeSpan 相比,添加和减去 TimeSpan 的开销是多少?
谢谢。
我有一个带有中断的 C# 程序,它处理我希望每 40 毫秒运行一次的列表的一部分,但是中断内的数学运算可以冻结具有某些大小和属性的列表的程序。
我很想尝试通过从数学中删除 TimeSpan 加减并在执行算术之前而不是之后将它们全部转换为 TotalMilliseconds 来加速它。有谁知道与获取 TotalMilliseconds 并添加和减去 TimeSpan 相比,添加和减去 TimeSpan 的开销是多少?
谢谢。
这是不明智的,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 位整数运算。 比整数到浮点+舍入转换快得多。