Ruby:放慢评估速度

时间:2011-10-12 02:50:51

标签: ruby

我对简单地减慢ruby代码的评估感兴趣。当然我知道使用sleep(),但这并没有解决我的问题。

相反,我想减慢虚拟机中发生的每一个对象实例化和破坏。

为什么呢?因此,我可以通过观察它们的实施来了解ruby中的特定程序。我最近了解了ObjectSpace以及查看/检查当前生活在Ruby VM中的所有对象的能力。似乎在ObjectSpace中构建对象和属性的简单实时显示然后减慢评估将实现这一点。

我意识到可能有一些方法可以实时查看ruby进程中发生的更详细的日志,包括许多低级实现的程序,低于实际的ruby代码级别。但我认为只是实时地看到对象及其属性的创建和破坏会更有启发性,更容易理解。

3 个答案:

答案 0 :(得分:2)

您可能对此问题的答案感兴趣:getting in-out from ruby methods

对那里报告的代码进行少量编辑后,您可以为每个方法调用添加一个休眠并跟随代码执行。

答案 1 :(得分:1)

如果要在每次实例化对象时输出一些信息,可以通过覆盖Class#new来实现。这是一个例子:

class Class
  alias old_new new

  def new(*args)
    puts "Creating: #{self.inspect}"
    sleep 0.1
    old_new(*args)
  end
end

class Point
end

class Circle
end

alias old_new new行创建了备用new方法,因此我们可以使用旧的行为。然后,我们覆盖new方法并放置一些代码来检查主题类,并为了更好的可读性而稍微休眠一下。现在,如果您调用Point.new,您将看到“正在创建:点”。 Circle.new将显示“正在创建:圆圈”等。创建的任何对象都将被记录,或者至少是他们的类,但延迟很短。

该示例是来自here的修改版本。

对于物体的破坏,我不确定是否有合理的方法来做到这一点。您可以尝试覆盖GC module中的某些方法,但垃圾收集仅在必要时启动(据我所知),因此您可以轻松地使用ruby一段时间而不会发生任何事情。无论如何它可能不会很有用。

答案 2 :(得分:0)

我认为问题不在于红宝石太快了。

在您的情况下,您应该使用一些软件架构,例如Model-View-Controller。

可能就是这样。在视图中,您可以显示控制器应为您显示信息的速度选项,或者您可以减慢速度或提高显示信息的速度。然后,Controller评估小步骤(在Model中调用方法)并在View中呈现评估结果。

View并不总是浏览器或窗口应用程序,它也可能只是一个简单的终端。