Да, вы упускаете грубую неэффективность.Попробуйте это в irb, чтобы увидеть, что вы делаете:
(Time.mktime(2011,01,01,00,00,00,"+05:00") .. Time.now).each { |x| puts x }
Оператор диапазона будет работать с 1 января по настоящее время с шагом одна секунда , и это огромный список.К сожалению, Ruby не достаточно умен, чтобы объединить генерацию диапазона и однонедельное разбиение на части в одну операцию, поэтому он должен построить весь список ~ 6 миллионов записей.
Кстати, "прямо вперед" и "брутто"неэффективность "не являются взаимоисключающими, на самом деле они часто являются параллельными условиями.
ОБНОВЛЕНИЕ : Если вы сделаете это:
(0 .. 6000000).step(7*24*3600) { |x| puts x }
Тогда вывод будет произведен почтимгновенно.Таким образом, похоже, что проблема в том, что Range не знает, как оптимизировать порцию, когда сталкивается с диапазоном объектов Time, но он может довольно хорошо разобраться с диапазонами Fixnum.