我对简单地减慢ruby代码的评估感兴趣。当然我知道使用sleep(),但这并没有解决我的问题。
相反,我想减慢虚拟机中发生的每一个对象实例化和破坏。
为什么呢?因此,我可以通过观察它们的实施来了解ruby中的特定程序。我最近了解了ObjectSpace以及查看/检查当前生活在Ruby VM中的所有对象的能力。似乎在ObjectSpace中构建对象和属性的简单实时显示然后减慢评估将实现这一点。
我意识到可能有一些方法可以实时查看ruby进程中发生的更详细的日志,包括许多低级实现的程序,低于实际的ruby代码级别。但我认为只是实时地看到对象及其属性的创建和破坏会更有启发性,更容易理解。
答案 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并不总是浏览器或窗口应用程序,它也可能只是一个简单的终端。