0

我在下面有一个函数,它为一个数组生成一组组合,长度不同,由一个范围定义。我希望能够获得有关组合过程的数据,其中包括处理组合所需的时间。鉴于以下情况:

source = ("a".."z").to_a
range = 1..7

生成组合的命令是这样的:

  combinations = (range).flat_map do |size|
    source.combination(size).to_a
  end

该命令在我的机器上运行大约需要 5 秒,并生成 971,711 个组合。但是,当我尝试在函数的上下文中执行此操作时,如下所示:

def combinations(source, range)
  time_start = Time.now

  combinations = (range).flat_map do |size|
    source.combination(size).to_a
  end

  time_elapsed = (Time.now - time_start).round(1)
  puts "Generated #{combinations.count} in #{time_elapsed} seconds."
  return combinations
end

source = ("a".."z").to_a
range = 1..7

combinations(source, range)

该函数几乎立即输出:

Generated 971711 in 0.1 seconds.

...然后 5 秒后返回组合。这里发生了什么?以及如何计算处理组合所需的持续时间?

4

2 回答 2

0

当我在 Ubuntu 12.04 32 位机器上的 ruby​​ 2.0.0p247 上运行您的代码时,我得到输出:

Generated 971711 in 0.6 seconds.

然后程序立即退出。

由于puts程序中只有一行,“然后 5 秒后返回组合”是什么意思?还有更多您没有向我们展示的代码吗?你正在运行什么红宝石解释器?什么操作系统?如果你还没有,你能提供完整的代码吗?

如果您想对此进行更多研究,我建议您尝试rblineprofruby ​​-prof 。

于 2013-08-02T23:19:21.723 回答
0

所以看起来这里的问题是红宝石需要大约 5 秒才能加载和显示 IRB 中的信息,但是“在 Y 秒内生成 X”。信息实际上是正确且有效的。这比我预期的要少,因为我对计算组合所需的时间与加载和开始显示组合输出所需的时间之间的差异感到困惑。

于 2013-08-03T00:26:27.613 回答