首先,我是 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”的想法完美匹配。所以我想出了解决方案2
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 倍。为什么?
谢谢
最佳答案
上下文切换的成本很高,比您正在实现的实际的、相当微不足道的计算要昂贵得多。如果您要对此进行分析,您 90% 的时间可能会被与线程相关的系统调用占用。
编辑:此外,如果您使用 CRuby/MRI,您将因缺乏真正的多线程而受到限制。请参阅Does ruby have real multithreading?了解详情。
关于Ruby 1.9.3 多线程实现比单威胁实现花费更长的时间,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8512818/