如何创建一个在其线程处于休眠状态时暂停的Ruby计时器?

时间:2012-06-14 03:01:44

标签: ruby multithreading timer benchmarking stopwatch

我的Ruby应用程序处理每个需要大约10秒钟才能执行的作业。每个工作都花费大量时间等待IO。我有定时器,使用简单的Time.now比较来记录作业的每个阶段需要多长时间:

def timer
  t = Time.now
  yield
  (Time.now - t).seconds
end

timer do
  # IO
end
=> 1.342

最初,我按顺序处理了所有作业,这很好,只是机器在50%的时间内处于空闲状态(由于IO)。

我转而使用多线程模型来收回一些IO时间。现在我为每个作业生成一个新线程,最多可同时生成10个线程。这很好用,除了当一个线程在运行一个定时器块时被抢占时,计时器在线程处于休眠状态时保持“运行”,导致计时器返回一个人工膨胀的数字。

我需要的是找出计时器块的实际运行时间的方法,忽略睡眠时间。有没有办法实现这一点,比如问Thread.current它花了多少时间运行?

2 个答案:

答案 0 :(得分:1)

如果你想测量除挂钟时间以外的任何东西,就像你在这里做的那样,你需要使用类似于rusage gem的东西,它是UNIX getrusage方法的包装器。

这应该会让你分解实际执行的时间,而不是等待。

答案 1 :(得分:0)

Benchmark通过测量挂钟时间和CPU时间来做到这一点。