You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ruby中upto方法为何远慢于手动Range?性能测试解析

为什么Ruby中upto方法比手动创建Range对象耗时多?

测试代码

n = 5000000
Benchmark.bm(7) do |x|
  x.report("upto  :")   { for i in 1..n; 0.upto(10) ; end }
  x.report("range :")   { for i in 1..n; 0..10 ; end }
end

测试结果

user     system      total        real
upto   :     1.116440   0.068953   1.185393 (  1.187705)
range  :     0.156921   0.000000   0.156921 (  0.156759)

原因分析

两者性能差距的核心在于底层实现逻辑的差异:

  • 0..10是Ruby的字面量语法,解释器会直接生成Range对象,操作非常轻量,几乎没有额外开销。
  • 0.upto(10)是方法调用,Integer类的upto方法内部不仅要构建Range对象,还会默认执行遍历这个范围的逻辑(即便你没有传入代码块处理遍历结果)。额外的方法调用栈、遍历相关的内部操作,都会带来显著的性能损耗。

简单来说,upto不是单纯创建范围,它自带了遍历执行的动作;而字面量Range只是创建一个范围对象,没有多余的执行步骤,所以前者耗时远高于后者。

内容的提问来源于stack exchange,提问作者JoJo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 15:45:43