计算星期几:比编译器更快的方法
A faster way to calculate the day of the week
将日期转换为星期几看似简单,实则暗藏玄机。本文深入底层,展示了一系列超越编译器默认输出的极速算法。从简单的取模运算到 Cassio Neri 的无溢出方案,再到仅用三次指令即可完成的 Mul-Add-Shift 技巧,这些方法在 AMD Ryzen 9 和 Apple M4 Pro 上实现了惊人的性能提升。作者不仅揭示了如何利用位运算和数学恒等式优化计算,还探讨了在 x86 和 ARM 架构上的具体实现差异,为高性能日期库和数据库引擎开发者提供了宝贵的优化思路。
将“日计数”转换为“星期几”听起来应该简单得无需多言,但当我们深入底层查看时,这却是一个令人惊讶的复杂问题。
HN 评论区
88- walrus01
这篇文章写得真好,对编程也很有用。不过,如果你想在脑子里心算星期几,还有个不同的(同样非常实用)的窍门。它利用的是公历中的月份和日期,而不是当年的第几天,因为 99% 的情况下你想知道的都是这类问题:“2026 年 8 月 31 日是星期几?”
这个窍门的要点是:在任何一年,无论是平年还是闰年,以下日期在同一年里总是落在同一个星期几:4 月 4 日、6 月 6 日、8 月 8 日、10 月 10 日和 12 月 12 日。(无论你用美国习惯的月/日格式,还是世界其他地方常用的日/月格式,这些日期都保持不变,这点很方便)。这些日期具体是星期几会因年份而异:今年(2026 年)它们全是星期六,去年全是星期五,明年则全是星期日。但在任何给定的一年里,这些日期之间相隔 63 天,是 7 的倍数,所以它们总是落在同一个星期几。
而且还不止这些:看看 5 月 9 日、9 月 5 日、7 月 11 日和 11 月 7 日——它们也是同一个星期几!(同样很方便的是,无论你用美式日历格式还是世界其他地方的格式,这招都管用)。这些奇数月份和日期的组合可以用一句口诀轻松记住:“在 7-11 便利店上一份朝九晚五的班”(a 9-to-5 job at 7-11)。搞定,你现在已经记住了十二个月中九个月的“特殊”日期。(至于 1 月、2 月和 3 月怎么办,我稍后会讲)。
现在我先暂停一下,解释一下这为什么有用。你们中的许多人都有 al […]
- srean
我的评论其实跟内容本身关系不大,但……这就是我想要的互联网。既能利用网络优势(可视化、交互性),又能保持结构清晰、简洁的文档。我也非常喜欢整体的视觉风格,做得太棒了。/glaze