奇怪?为什么 floor((n + t - 1) / t) 比 ceil(n / t) 更高效?(因为没有浮点转换带来的性能损耗)

为什么 (n + t - 1) // tceil(n / t) 更高效?

导言

在刷leetcode的时候,发现了用 (n + t - 1) / t替换ceil(n/t)从而带来的性能优化

原理:(因为没有浮点转换带来的性能损耗)

在处理数组分块、分页计算等场景时,我们经常需要计算向上取整的除法。例如,将长度为103的数组分成长度为10的块,需要计算ceil(103/10)=11

常见的实现方式有两种:

  1. 直接向上取整:math.ceil(n / t)
    • math.ceil(103/10)=11
  2. 整数运算模拟:(n + t - 1) // t(这里//表示纯整数除法)
    • (103+10-1)//t=11

虽然结果相同,但后者在多数情况下更高效(因为没有浮点转换带来的性能损耗)。

数学原理(太妙啦啦啦啦啦啦啦啦啦)

偏移量设计

选择t-1作为偏移量的原因:

  1. 当n能被t整除时​(余数r=0):

    • n = k*t
    • (n + t - 1) // t = (k*t + t - 1) // t = k + (t-1)//t = k(正确)
  2. 当n不能被t整除时​(余数r≥1):

    • n = k*t + r
    • (n + t - 1) // t = (k*t + r + t - 1) // t = k + (r + t - 1)//t = k + 1(正确)

示例验证

python 复制代码
# 整除情况
(4 + 2 - 1) // 2 = 5 // 2 = 2  # 等同于ceil(4/2)
# 非整除情况
(5 + 2 - 1) // 2 = 6 // 2 = 3  # 等同于ceil(5/2)

性能分析

ceil(n / t)的问题

大多数语言在实现这个函数的时候,内部都会使用强制浮点运算

  1. 强制浮点运算​:

    • 整数→浮点转换
    • 浮点除法
    • 浮点取整

强制浮点运算会带来性能损耗

(n + t - 1) // t的优势

这里的//在python中表示纯整数除法

python 复制代码
sum = (103+10-1)//10 = 11

在java或者C/C++中只要类型是int,计算除法的时候就会触发纯整数除法

java 复制代码
int sum = (103+10-1)/10 = 11
  1. 纯整数运算​:

    • 直接使用CPU整数除法指令
    • 无类型转换开销

更稳定不受浮点精度限制,需要纯整数运算支持,例如下面的语言

语言特性差异

语言 推荐写法 原因
C/C++/Java (n + t - 1) / t 整数除法直接截断
Python (n + t - 1) // t //避免浮点运算
JavaScript/TS Math.ceil(n / t) JS和TS中的所有除法都是浮点运算,使用Math.ceil可读性优先
高性能场景 (n + t - 1) >> k (t=2^k) 位运算最快

建议

  1. 优先考虑整数运算​:

    • 在支持整数除法的语言中使用(n + t - 1) // t
  2. 可读性与性能平衡​:

    • 在JS/TS等语言中,Math.ceil的可读性更佳
  3. 特殊场景优化​:

    • 当除数为2的幂次时,可用位运算进一步优化
  4. 避免过早优化​:

    • 非性能关键路径可优先考虑代码可读性

总结

(n + t - 1) // t通过巧妙的数学设计,在多数编程语言中实现了:

  • 更高效的纯整数运算
  • 避免浮点转换开销
  • 更好的大数稳定性

6666666666666666666

相关推荐
爱勇宝几秒前
CEO通知5100名员工:今年不涨薪了,钱要投给AI!
前端·后端·程序员
何以解忧,唯有..几秒前
Go 语言指针类型详解:从基础到实战
开发语言·后端·golang
乘风gg9 分钟前
前端死到第几轮了?得物前端部门解散有感!
前端·ai编程·claude
艾伦野鸽ggg13 分钟前
web 组大一下第二次考核
前端·css·html
北域码匠14 分钟前
奇偶归并排序:并行计算的排序利器
数据结构·算法·c#·排序算法
掘金者阿豪18 分钟前
这本讲故事的数学科普书里,藏着AI背后的底层密码
后端
水煮白菜王19 分钟前
高德地图"未获得商用授权"水印临时移除方案
前端·javascript
库拉AI小李20 分钟前
# 数据清洗与分析:Gemini 3.5 处理 Excel 数据的实操体验
前端·人工智能·后端
小小小小宇20 分钟前
React17 18 19 新增能力、解决问题、原理与使用详解
前端
by————组态22 分钟前
Ricon组态可视化编辑器 - 所见即所得的工业画布
前端·javascript·物联网·架构·编辑器·组态