В вашем исходном файле: c = [clan, Clan.first (: offset => rand (Clan.count))] Это работает, но похоже, что вы выбираете случайное число в Ruby.Из того, что я понимаю, если вы можете сделать что-то в SQL вместо Ruby, это обычно быстрее.Попробуйте это:
c = [clan,Clan.find(:all, :limit => 1, :order => 'random()')
Вы не получите слишком много прироста, так как он запускается только дважды на клан (всего 20х), но есть похожие линии, как эти две
# (runs 60x total)
rand_champion = Champion.first(:offset => rand(Champion.count))
# (runs up to 200x, I think)
c = [clan,Clan.first(:offset => rand(Clan.count))]
В общем, вы можете почти всегда найти что-то еще для оптимизации в вашей программе.Таким образом, ваше время наиболее эффективно используется, начиная с областей, которые повторяются чаще всего - с наиболее глубоко вложенными циклами.Я оставлю оптимизацию двух вышеупомянутых строк (и любых других, которые могут быть похожими) вам в качестве упражнения.Если у вас возникли проблемы, просто дайте мне знать в комментарии.
Кроме того, я уверен, что вы получите много хороших предложений во многих ответах, поэтому я настоятельно рекомендую настроитьэталон, чтобы вы могли измерить различия.Не забывайте запускать его несколько раз для каждой тестируемой версии, чтобы получить хорошее среднее значение (программы, работающие в фоновом режиме, потенциально могут сгенерировать ваши результаты).
Что касается простоты, я думаю, что читабельность очень важна,Это не заставит ваш код работать быстрее, но может ускорить отладку (и ваше время важно!).Несколько вещей, которые доставляли мне неприятности, были неописуемые переменные, такие как c
и p
.Я делаю это тоже иногда, но когда у вас есть несколько из этих переменных в одной и той же области, я очень быстро достигаю точки, когда я думаю, «для чего эта переменная снова?».Нечто подобное temp_clan
вместо c
имеет большое значение.
Для удобства чтения я также предпочитаю .each
вместо for
.Впрочем, это полностью личное предпочтение.
кстати, я люблю League of Legends:)
Edit: (комментарии не позволят мне сделать отступ). После второго взгляда я понял, что этоФрагмент может быть оптимизирован далее:
for p in item.players.limit(5)
rand_champion = Champion.first(:offset => rand(Champion.count))
match.participations.create!(:player => p, :champion => rand_champion)
end
change Champion.first(:offset => rand(Champion.count))
rand_champs = Champion.find(:all, :limit => 5, :order => 'random()')
for p ...
i = 0
match.participations.create!(:player => p, :champion => rand_champs(i))
i++
end
Это уменьшит 5 SQL-запросов до 1. Так как он называется 60x, это уменьшит ваши SQL-запросы с 60до 12. В качестве дополнительного плюса, вы не получите повторных чемпионов в одной команде (или я думаю, что это может быть недостатком, если это было ваше намерение)