Вы должны выполнить профилирование в своем коде, чтобы увидеть, что занимает много времени.Вы можете выяснить, как работать с профилировщиками, или просто добавить несколько простых операторов puts
или logger.info
в ваш код с отметкой времени.Вероятно, проще всего сделать это с помощью Benchmark
.Примечание: вам может понадобиться require 'benchmark'
... не уверен, если это требуется автоматически в Rails или нет.
Для отдельной строки вы можете сделать что-то вроде этого:
logger.info Benchmark.measure { @cv = Cv.find(params[:cv_id], :include => [:desired_occupations, :past_occupations, :educational_skills]) }
И для синхронизации больших блоков кода:
logger.info Benchmark.measure do
(@cv.desired_occupations + @cv.past_occupations).each do |occupation|
section = []
section << 'Desired occupation' if @cv.desired_occupations.include? occupation
section << 'Work experience' if @cv.past_occupations.include? occupation
unless (array = @occupation_hashes.assoc(occupation)).blank?
array[1] += 1
array[2] = (array[2] & section).uniq
else
@occupation_hashes << [occupation, 1, section]
end
end
end
Я бы просто начал с больших блоков, а затем сузил их.Не зная, с каким размером набора данных вы имеете дело, трудно сказать, что представляет собой проблемная зона.
Я также согласен с другими, что вам будет гораздо лучше разбить эту вещь на более мелкие методы.,Это также облегчит тестирование производительности, так как вы можете делать такие вещи, как:
Benchmark.measure { 10000.times { foo.do_that_thing_that_might_be_slow }}