为何两种Ruby代码块执行时间测算方法返回结果不一致?
为什么两种Ruby耗时测算方法结果有细微差异?
嘿,别担心,你写的这两个方法逻辑上没什么错误,结果不一样完全是正常的现象~
差异的核心原因
其实这两个方法的核心逻辑是完全一致的:都是记录代码块执行前后的系统时间,再计算差值。之所以结果有细微差别,主要来自这两点:
Time.now获取的是系统当前时间戳,每次调用的时机哪怕只差几纳秒,返回值就会不同。methodone里是直接用Time.now - start,相当于代码块执行后立刻调用一次Time.now;而methodtwo多了一步end_time = Time.now的赋值操作,这行代码本身也需要极短的执行时间,导致两次Time.now的调用间隔比methodone多了一点点,差值自然就有区别。- 系统时钟本身存在微小波动,哪怕同一时刻连续调用
Time.now,返回结果也可能有细微偏差。
更可靠的耗时测算方式
如果想要得到更准确、稳定的耗时数据,推荐使用Ruby标准库的Benchmark模块——它可以多次运行目标代码,通过取平均值来减少单次测算的误差。示例代码如下:
require 'benchmark' def methodone(a) start = Time.now a.call Time.now - start end def methodtwo(a) start_time = Time.now a.call end_time = Time.now end_time - start_time end a = Proc.new do {} end # 运行100000次获取稳定结果 Benchmark.bm(10) do |x| x.report("methodone") { 100000.times { methodone(a) } } x.report("methodtwo") { 100000.times { methodtwo(a) } } end
运行后你会发现,两种方法的平均耗时几乎没有区别——单次赋值的开销在大量循环中完全可以忽略不计。
另外,你用的是空代码块do {} end执行时间极短,所以微小时间差会显得比较突出。如果换成有实际运算的代码块(比如1000.times { 2**10 }),两次测算的差异比例会小很多。
总的来说,作为新手能想到用两种方式验证耗时,已经很棒啦~这种细微差异是程序执行中的正常现象,不用纠结哦!
内容的提问来源于stack exchange,提问作者skypen
相关产品推荐
相关产品推荐

