我很好奇我们是否最终获得了一个带有 JDK8 的快速日期时间库。几乎所有的LocalDate
计算都使用toEpochDay
了,所以我查看了源代码,大量的划分和分支让我很好奇我是否可以做得更好。
我消除了一些分支和除一个以外的所有分支,但是加速比预期的要差。所以我的第一个问题是,使用多重除法的算法怎么可能只需要大约 30 个周期(吞吐量)。Holger 的评论似乎已经回答了这个问题:除以一个小常数得到 JIT-ed 到乘法。我是手动完成的,现在我一直以 2 倍的速度击败原始实现。
基准测试非常简单,只需遍历一个随机数组LocalDate
并转换它们中的每一个toEpochDay
。尽管存在随机性,但结果非常一致。数组的大小是一个参数,我的主要问题是2000 到 30000 之间的大幅减速来自哪里。由于数据不再适合 L1 缓存,因此应该会有所放缓,但是两种算法的内存访问完全相同(即,除了date
从数组中获取之外没有)。
仍然悬而未决的问题是:当迭代一个数组时,同一函数的两个简单的无内存访问实现的行为是如何发生变化的?原始算法的减速比我的要大得多。