Ruby 1.9.3多线程实现比单一威胁实现需要更长的时间,为什么?

时间:2011-12-14 22:44:33

标签: ruby multithreading

首先,我是Ruby newby,我正在努力学习这门语言。我所知道的最好的学习方法就是用它来解决问题。所以我采用了一个简单的字符串问题并实现了 solution1 ,如下所示:

def similarities(str)
  result = str.length

  (1..str.length - 1).each { |start|
    str2 = str[start..-1]

    index = 0
    str2.split(//).each do |c|
      break if c != str[index, 1]
      index += 1
    end

    result += index
  }

  result
end

然后我发现这是一个完全匹配的“平行的foreach”类型的思考。所以我想出了 solution2

def similarities(str)
  result = str.length

  threads = []
  (1..str.length - 1).each { |start|
    str2 = str[start..-1]
    threads << Thread.new { calculate(str, str2) }
  }

  threads.each { |t| t.join; result += t["index"] }

  result
end

def calculate(str, str2)
  index = 0
  str2.split(//).each do |c|
    break if c != str[index, 1]
    index += 1
  end

  Thread.current["index"] = index
end

令我惊讶的是, solution2 在完全相同的输入上比 solution1 花了大约8倍的时间。为什么?

谢谢,

1 个答案:

答案 0 :(得分:3)

上下文切换比您实现的实际,相当简单的计算要昂贵得多。如果您要对此进行分析,那么90%的时间可能会被与线程相关的系统调用所占用。

编辑:此外,如果你正在使用CRuby / MRI,你将会受到缺乏真正多线程的限制。有关详细信息,请参阅Does ruby have real multithreading?