我正在编写一个程序,将数据从四个 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 分钟。
线程之间没有共享资源。每个都打开一个不同的数据文件并将数据加载到与其他数据不同的数据结构中。