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
相关产品推荐
相关产品推荐

