1

我有一个执行 IO/计算的函数。我做了一个演示函数,它从这里复制到那里~300MB。如果我在一个我立即加入的线程中运行它,它比我在没有线程的情况下运行它要慢得多。我检查了:

def cp
  start = Time.now
  FileUtils.cp_r("C:/tmp", "C:/tmp1")
  fin = Time.now - start
  p fin
end

比较这些:

cp

Thread.new{cp}.join

第一次cp调用总是比线程调用快两到四倍。如果我这样做也会发生同样的情况

cp

Thread.new{cp}

sleep 200

我听说过 GIL 等,但在这里,一次只运行一个线程,因此没有运行时间竞赛。关于如何使其更快或为什么会发生这种情况的任何想法?

4

1 回答 1

1

线程并不能保证事情会运行得更快,甚至与非线程代码的速度相同,至少目前在 MRI 中是这样。JRuby 可能会更好。你cp没有得到 CPU 的全部注意力,这就是为什么在没有线程的情况下执行它并允许它阻塞直到完成会更快。

考虑fork改用。

在 Ruby 中启动子流程的十几种(左右)方法:第 1 部分”看起来很有用。还有“如何在 Ruby 中生成子进程? ”。

于 2013-05-19T15:45:14.063 回答