Ruby 如何加快简单数组迭代的过程?

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",

我的阵列有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",
            :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
快一点,但事实并非如此。