1

我的 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 运行了多少时间?

4

2 回答 2

1

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

这应该让您分解实际执行而不是等待所花费的时间。

于 2012-06-14T05:54:05.850 回答
0

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

于 2012-08-03T19:53:05.313 回答