64位floor division乱象丛生:新算法ARM快20%,x86却两难

原创
alex 42分钟前 阅读数 1 #头条

64位floor division乱象丛生:新算法ARM快20%,x86却两难

为什么64位有符号floor division如此尴尬?

有符号整数 floor division 是一个很基础的操作。a 除以 b,结果向负无穷取整。标准的有符号除法向 0 取整,也就是截断。5 除以 2 得 2,-5 除以 2 得 -2。floor division 不一样,-5 除以 2 得 -3 BJ。我在写代码时常常因为负数取整踩坑,比如时间戳换算,用截断除法有时会差一天。

Hacker's Delight 里有一句话,'[I suspect that] floor division more often gives the result you want' BJ。这本书基本是低层计算机数学的圣经。文章作者直接引用它,说明 floor division 在现实里确实有用,值得认真做。

可是现实很尴尬。主流编译器 C/C++/Go/Swift 都不原生提供 floor division BJ。这意味着写代码的人要么自己实现,要么将就着用截断除法。这两种选择都不理想。

更糟的是,至少一个高度著名的软件库有一个 buggy 溢出实现,存在了超过 4 年 BJ。在线搜索和 LLM 提示通常只展示慢算法 BJ。我搜过相关话题,看到的实现几乎都是绕远路。

新算法与量化性能数据

这篇文章写于 27 October 2026 BJ,副标题是'The missing chapter of Hacker's Delight' BJ。一本被当作参考书的圣经,居然没怎么讲 floor division,这本身就很反常。

新算法在 ARM 上比现有算法吞吐量快 10-20%,覆盖大多数 64 位除数,偶尔持平,延迟相等或更好 BJ。注意这个提升是相对现有最快算法而言的。

x86 上的表现要复杂一些。约 80% 的正 64 位除数快 5-10%,60% 的负除数也更快。剩下的情况反而较慢,延迟通常更差但竞争性 BJ。同一算法在不同架构上表现不一样,这一点值得留意。作者在 benchmark 一节里展示了每个除数的详细结果,覆盖多个平台 BJ。

算法适用于所有位宽,可能用于 32 位或 SIMD,最大收益在 64 位 BJ。作者拿 86400 做吞吐量 benchmark,一天有 86400 秒,这个除数在时间换算里很常见 BJ。柱状图里,快算法比大多数语言内置方法快不少。作者说 floor division 可以比你意识到的快得多 BJ。

多源交叉验证与反直觉启示

作者在文章里下了一个判断,世界整数 floor division 处于混乱状态 BJ。支撑这个判断的证据是具体的。编译器 C/C++/Go/Swift 不原生提供,实现 floor division 的库几乎从不用最快算法 BJ。在线搜索和 LLM 提示通常只展示慢算法 BJ。

Hacker's Delight 几乎没提 floor division,新算法被称作缺失章节,这是反直觉的发现 BJ。一本被广泛当作参考的书,在这个操作上留了空白。

性能数据跨平台对比也给出启示。ARM 上普遍快 10-20%,x86 上却只有 80% 正数快 5-10% 而其余慢 BJ。同一算法在不同 ISA 上表现不同,做性能优化时不能只看一个平台。

Hacker's Delight 说 floor division 更常给出你想要的结果 BJ,但实际支持匮乏。如果写代码时遇到按天或按秒取整,这篇博客值得认真读一遍。


原文:

A new faster algorithm to compute 64-bit signed floor division · 来源:Hacker News

作者:itfan123 值班编辑 · 发布于 2026年10月27日

版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除