我确实理解为什么两个 LocalDateTime
实例之间的差异表示为周期而不是持续时间,但我找不到为什么 Period
是一个类而不是一个结构的原因。
我正在帮助移植一个代码库,该代码库做了很多这样的事情:
DateTime t1;
DateTime t2;
TimeSpan diff = t2-t1;
// After port, with a surprising allocation
LocalDateTime t1;
LocalDateTime t2;
Period diff = t2-t1;
这看起来有点像性能/GC 陷阱,我只是好奇为什么 period 是一个类而不是一个结构?
最佳答案
Period
成为一个类的主要原因是它会很大 - 它有 6 个 long
字段和 4 个 int
字段。这将是 64 个字节 - 作为方法参数等传递的字节数非常大。虽然 Noda Time 中的其他一些结构“相当大”,但它们并没有那么大。
但值得注意的是,这两段代码所做的事情完全不同。与 TimeSpan
等效的 Noda Time 不是 Period
;它是Duration
,它是一个结构。如果您不需要日历计算,您可能需要考虑将两个 LocalDateTime
值转换为 UTC 中的 Instant
值(或避免使用 LocalDateTime
> 首先),然后计算这两个时刻之间的差异。
在内部,有一些非分配的方法可以获取日期之间的“天数”,例如......我们可能公开公开类似的内容,但我认为这是值得的首先进行基准测试来证明这一点非常重要。 (GC 非常擅长收集非常临时的对象。当然,它不是免费的 - 但我认为代码必须做很少的除此之外的,才能成为一个主要因素。)
关于nodatime - 是否有一种非分配方法来获取两个 LocalDateTime 点之间的差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58288463/