首先,我是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倍的时间。为什么?
谢谢,
答案 0 :(得分:3)
上下文切换比您实现的实际,相当简单的计算要昂贵得多。如果您要对此进行分析,那么90%的时间可能会被与线程相关的系统调用所占用。
编辑:此外,如果你正在使用CRuby / MRI,你将会受到缺乏真正多线程的限制。有关详细信息,请参阅Does ruby have real multithreading?。