вложенный цикл в шоу на контроллере в оптимизации Ruby - PullRequest
0 голосов
/ 02 марта 2012
@release = Release.find(params[:id])
@release_cycles=@release.cycles    
@release_cycles=Cycle.find_by_sql("select * from cycles where release_id=#{params[:id]}")
current_page=params[:page]?Integer(params[:page]):1
@release_cycles = @release_cycles.paginate(:page=>params[:page],:per_page=>5)
release_ics=@release.ics
puts "params[releases==]==#{params[:releases]}"

releases=params[:releases].to_i
release1=(releases>0)?Release.find(params[:releases]):nil
puts "release1==#{release1}"

@non_ics=(release1!=nil)?(release1.ics):Ic.active

@non_members=[]  

@non_ics.each do |non_ic|
  check=1
  release_ics.each do |release_ic|
    if non_ic==release_ic
      check=0
      puts "inside ics comparison if"
    end
  end
  if check==1
    puts "inside if ! in release_only"
    @non_members << non_ic
    puts "@ics==#{@non_members}"
  end   
end

...

  respond_to do |format|
    format.html # show.html.erb
    format.xml  { render :xml => @release }
  end
end

В конце комментируемый блок кода истощает время выполнения как сумасшедший (загрузка занимает около 20-30 секунд). Думаю, у меня есть идея, как это оптимизировать, но я бы хотел, чтобы третье лицо подумало, как оптимизировать код, чтобы сделать это быстрее

1 Ответ

1 голос
/ 02 марта 2012

Вся ваша верхняя часть кода может быть заменена 4 строками кода:

@release = Release.find(params[:id])
@release_cycles = @release.cycles.paginate(:page=> params[:page].presence || 1,  
    :per_page=>5)
@non_ics= params[:releases].present? ? Release.find(params[:releases]).ics : 
     Ic.active
@non_members = @non_ics - @release.ics

Помимо кода, который можно улучшить, вы загружаете все выпуски в память и разбиваете на страницы набор результатовРубиновое пространство памяти.Что может замедлить ваш процесс, если у вас есть большое количество циклов для каждого выпуска.

Я вычислил пересечение между двумя массивами в последней строке, используя Ruby.Если размер массива большой, я бы использовал для этого SQL.

...