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