nodatime - 是否有一种非分配方法来获取两个 LocalDateTime 点之间的差异?

标签 nodatime

我确实理解为什么两个 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/

相关文章:

c# - "The type mapping for ' Instant ' has not implemented code literal generation"分割实体时

c# - 获取并格式化与 NodaTime ZonedDateTime 值对应的 UTC 时间?

c# - Nodatime 在给定时间和时区的情况下创建 ZonedDateTime

c# - 在 PostgreSQL 中存储基于 NodaTime 的值的最佳方法是什么?

c# - 如何使用 NodaTime 将 IANA zone + datetime 转换为 UTC + Offset

asp.net-core - NodaTime 与 NetCoreApp 1.0 兼容吗?

c# - 为什么我不能向 OffsetDateTime 添加月份?

c# - Noda Time WeekOfWeekYear 从星期日开始而不是星期一

c# - NodaTime Invalid DateTime.Kind for Instant.FromDateTimeUtc