gpt4 book ai didi

多线程与单线程的 Ruby 性能

转载 作者:数据小太阳 更新时间:2023-10-29 07:17:50 26 4
gpt4 key购买 nike

我正在编写一个程序,将四个 XML 文件中的数据加载到四个不同的数据结构中。它有这样的方法:

def loadFirst(year)
File.open("games_#{year}.xml",'r') do |f|
doc = REXML::Document.new f
...
end
end
def loadSecond(year)
File.open("teams_#{year}.xml",'r') do |f|
doc = REXML::Document.new f
...
end
end

etc...

我本来只是用了一个线程,加载了一个又一个文件:

def loadData(year)
time = Time.now
loadFirst(year)
loadSecond(year)
loadThird(year)
loadFourth(year)
puts Time.now - time
end

然后我意识到我应该使用多线程。我的预期是,在单独的线程上从每个文件加载的速度将是顺序加载的速度的四倍(我有一台配备 i7 处理器的 MacBook Pro):

def loadData(year)
time = Time.now
t1 = Thread.start{loadFirst(year)}
t2 = Thread.start{loadSecond(year)}
t3 = Thread.start{loadThird(year)}
loadFourth(year)
t1.join
t2.join
t3.join
puts Time.now - time
end

我发现使用多线程的版本实际上比另一个慢。这怎么可能?差异大约为 20 秒,每次大约需要 2 到 3 分钟。

线程之间没有共享资源。每个打开不同的数据文件并将数据加载到与其他不同的数据结构中。

最佳答案

我认为(但我不确定)问题是您正在读取(使用多个线程)放置在同一磁盘上的内容,因此您的所有线程不能同时运行,因为它们等待 IO(磁盘)。

几天前,我不得不做类似的事情(但从网络获取数据),顺序与线程之间的差异是巨大的。

一个可能的解决方案是加载所有文件内容,而不是像您在代码中那样加载它。在您的代码中,您逐行阅读内容。如果你加载所有内容然后处理它你应该能够表现得更好(因为线程不应该等待 IO)

关于多线程与单线程的 Ruby 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17549455/

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