在多线程环境中测量线程的执行时间

3

在Ruby/Rails中,在多线程环境下是否可以测量单个线程的实际执行时间?

我一次创建多达10个线程,目前正在计算每个线程的经过时间,但由于多个线程共享处理器,它们会共享资源并存在间隙。因此,我的时间将超过实际时间。

@urls.each do |url|
  Thread.new do
    time = Time.now
    request = http.get(url)
    response_time = Time.now - time
  end
  ...
end

你的结果可能取决于你使用的Ruby实现。例如,如果你坚持使用MRI,你将只有绿色线程,这意味着它们基本上是模拟线程,没有真正的系统线程参与其中。这也意味着你不能利用多个处理器。那么你在使用哪个Ruby呢? - jhchabran
哦,你应该使用Benchmark来测量性能,而不是基本算术和Time.now :) http://www.ruby-doc.org/stdlib-1.9.3/libdoc/benchmark/rdoc/Benchmark.html - jhchabran
1个回答

2

wycats开发了一个很棒的宝石叫做ruby-prof,可以帮助你。它支持同时对多个线程进行分析,包括进程时间、CPU时间和墙壁时间。


这是一个很好的线索。我现在会检查一下。 - Carson Cole
你对在生产环境中使用这个来测量进程时间有什么想法吗?因为我实际上是在生产环境中使用它,而不仅仅是为了改进流程而测量流程。我看到有提到ruby-prof会使实际进程时间翻倍。 - Carson Cole
我不确定它们有多具体,但NewRelic有一个非常好的监控服务,一开始是免费的。我已经有一段时间没有使用它了,但我真的很喜欢它,而且那是一段时间以前,我相信它现在已经成熟了。它似乎没有对性能产生不利影响,并且可以免费试用。也许值得一试?https://newrelic.com/ - Brad Werth
此外,我不确定你是否有同感,但我们很多生产应用程序都非常快速,并且在许多领域进行加倍处理不会对其产生可测量的影响。或者,如果您正在试图缩小某个特别慢的区域,也许暂时减速是值得的,即使进行几分钟的分析也可以指向问题所在。 - Brad Werth
或者,您可以尝试复制生产环境并模拟负载... 我猜相对数字比绝对时间更相关... - Brad Werth
实际上,我的使用方式是测量时间——我正在评估Web服务的响应时间——并且这是通过线程完成的。问题在于尝试缩小受其他线程延迟影响的时间范围。我现在看到的问题是,处理时间可能不包括实际的HTTP响应时间,而这正是我想要测量的。无论如何,你的答案绝对正确。 - Carson Cole

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接