Ускорение суммы запросов - ряд дат для диаграмм - PullRequest
1 голос
/ 04 мая 2011

Следующий запрос выполняется довольно быстро, но последовательная обработка, которая должна выполняться впоследствии, действительно замедляет этот метод.Я мог бы помочь с рефакторингом,Таким образом я получаю серию обратно с суммами за каждую дату, независимо от того, есть ли у нее сумма или нет.

Когда запрос возвращает только несколько дат, он выполняется довольно быстро.Но установите дату начала назад на год или два, и она станет невероятно медленной.Настоящим преступником является метод .detect .Он очень медленно сканирует массив объектов activerecord.

Есть ли более быстрый метод для генерации этой серии?

Ответы [ 2 ]

1 голос
/ 04 мая 2011

orders_by_day сгруппирован по «pg_print_date_group», поэтому это должен быть хеш «date» для объектов. так почему бы тебе просто не сделать

(start_time.to_date..Date.today).map do |date|
  order = orders_by_day[date.to_s(:db)]
  order && order.total_amount.to_f.round(2) || 0.0
end

Это должно серьезно уменьшить Big O вашего бега. И если я неправильно понимаю, и ваш orders_by_day не является хешем, предварительно обработайте его в хеш, а затем запустите карту, вы определенно не хотите обнаруживать каждую дату.

0 голосов
/ 04 мая 2011

Поскольку основным нарушителем в вашем коде является метод обнаружения, который должен сканировать массив снова и снова, я предлагаю вам инвертировать порядок, в котором вы создаете серию, так что вы сканируете массив только один раз, и ваш кодвыполняется за O (n) раз.

Попробуйте что-то вроде:

series = []
next_date = start_time.to_date
orders_by_day.each do |order|
  while order.print_date.to_date < next_date
    series <<  0.0
    next_date = next_date.next
  end
  series << order.total_amount.to_f.round(2)
  next_date += 1
end
while next_date < Date.today
    series <<  0.0
    next_date = next_date.next
end

Обратите внимание, что мой код не проверен;)

...