gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 08:52:52 27 4
gpt4 key购买 nike

首先,我是 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 倍。为什么?

谢谢,

最佳答案

上下文切换是昂贵的,比您正在实现的实际的、相当微不足道的计算要昂贵得多。如果您对此进行概要分析,您 90% 的时间可能会被与线程相关的系统调用占用。

编辑:此外,如果您使用的是 CRuby/MRI,您将因缺乏真正的多线程而受到限制。参见 Does ruby have real multithreading?了解详情。

关于Ruby 1.9.3 多线程实现比单一威胁实现需要更长的时间,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8512818/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com