Ruby 如何加快简单数组迭代的过程?
我的阵列有75000条记录,如下所示:Ruby 如何加快简单数组迭代的过程?,ruby,arrays,multithreading,performance,Ruby,Arrays,Multithreading,Performance,我的阵列有75000条记录,如下所示: orders = [{ :order_id=>"7617", :date=>"2014-11-17 19:24:31", :firstname=>"Jack", :lastname=>"Bauer"}, { :order_id=>"7618", :date=>"2014-11-17 19:34:51",
orders = [{ :order_id=>"7617",
:date=>"2014-11-17 19:24:31",
:firstname=>"Jack",
:lastname=>"Bauer"},
{ :order_id=>"7618",
:date=>"2014-11-17 19:34:51",
:firstname=>"James",
:lastname=>"Bond"},
... ]
Parallel.each(orders, :in_threads => 3){ |order|
...
}
现在,我需要使用以下代码循环此数组:
order_id_array = []
order_array = []
orders.each do |order|
prepared_order = prepare_order(order)
order_id_array << prepared_order[0]
order_array << prepared_order[1]
end
def prepare_order(order)
order_id = order[:order_id]
[ order_id,
{ :order_id => order_id,
:name => "#{order[:firstname]} #{order[:lastname]}",
:date => Time.zone.parse(order[:date]),
:customer_id => Moped::BSON::ObjectId.new } ]
end
但是,这对我没有任何帮助。分析代码以了解瓶颈是什么
如果让我猜的话,
Time.zone.parse
可能是>=80%计算的地方。给定固定的日期格式,您可以通过手动构造日期对象、从特定范围的子字符串中提取组件来显著提高性能。您能告诉我如何改进Time.zone.parse
?我无法更改日期
是一个需要设置时区的字符串。@ChristofferJoergensen:您错过了关键字“如果我必须猜测”:@ChristofferJoergensen,“请删除答案,这样看起来就没有答案了。”?什么?堆栈溢出不是这样工作的。直到你,海报上的人,将一个答案标记为“选定”答案,这个问题才看起来得到了回答。我们删除答案并不是为了让问题看起来没有答案。你特别问了如何加快这个过程。我们建议您查看最可能导致代码运行缓慢的原因,并尝试在执行其他操作之前修复它。线程和并行运行不会在一开始加快速度,因为它们会使工作复杂化,特别是在维护同步线程、不踩踏公共变量、调试和维护代码时。你没有说你在什么操作系统上,但是在*nix上,创建一个允许多次访问的数据存储,然后启动你的代码的多个实例,让多个实例同时运行。我以顺序运行OP的代码,其中包含第一个散列的300000个副本。花了10.2秒。注释掉完成解析的行后(将其更改为:date=>date.parse(order[:date])
)花费了0.4秒。看来你的估计有点偏差。:-)“我如何加速这个过程”-第一步是找出哪个部分慢。我在寻找一种更基本的加速方法。我在这里没有做太多繁重的计算,因此,即使我(例如)花费时间进行解析,我仍然需要一个接一个地迭代它们。顺便问一下,你试过MRI上的线程吗?坏主意。试试JRuby或Rubinius,它可能会产生更好的结果。从我之前在@Mattt的答案上发表的评论来看,日期-时间转换显然是瓶颈。我运行了三个案例,每个案例的orders
包含300000份第一个散列(o
下面是orders
的一个元素)#1::datetime=>datetime.parse(o[:date])
,9.6秒#2:datetime=>datetime.strtime(o[:date],“%Y-%m-%d%H:%m:%S”)
,1.3秒#3:datetime=>datetime.iso8601(t)
在t=o[:date]之后;t[10]=“t”
,3.1秒。因此,只要从parse
切换到strtime
…和#4:datetime=>datetime.new(s[0,4]。to_i,s[5,2]。to_i,s[8,2]。to_i,s[11,2]。to_i,s[14,2]。to_i,s[17,2]。to_i)
(其中s=o[:date]),1.1秒。考虑到strtime
是用C编写的,我希望它比使用new
快一点,但事实并非如此。