Pull to refresh

Comments 12

Респект за подобное! И плюс в карму.
Отличная возможность, а мне как начинающему рубисту не придется долго переучиваться и можно сразу держать в голове готовящийся функционал версии 2.0 )
То есть вся выгода в том, что в цепочках будет создаваться только 1 массив, вне зависимости от размера этой цепочки? Выгодно ли будет использовать его на небольших и средних массивах, где длинная цепочка вызовов?

Функция будет полезна, спасибо за реализацию!
Да имеено — результат высчитывается за один проход.
Второй вопрос хороший — сам о нем подумывал.
Если переформулировать — каково соотношение между длинной цепочки и размером массива при котором выгодно использовать ленивый подход.
Это просто бенчмаркнуть — gist.github.com/2146084
У меня получилось что при массиве из трех элементов ленивый подход в 6-7 раз медленнее.
При этом на массиве в 300 элементов — получаем выигрыш почти в 10 раз.
С бенчмарком дал маху первый раз. Проапдейтил пост на эту тему — смотрите секцию Update. Там же есть ссылка на issue на ruby-lang.org (в прикрепленном к issue файле сам бенчмарк).
Да уж, за 2 уикэнда с внутренностями руби разобраться, еще и свое дописать… Даже и не рискну повторить этот подвиг :) Спасибо и за вклад в опен сорс, и за пост, и за подборку ссылок :)
>… за 2 уикэнда с внутренностями руби разобраться
Если б это было возможно… К сожалению это только начало — первое знакомство так сказать.
Чтобы действительно понять и разобраться как все работает внутри — нужно колоссальное кол-во времени и усилий. С патчем в какой-то мере даже и повезло — оказался в нужное время в нужном месте и с сильным желанием это сделать.
По поводу ссылок — стоит упомянуть еще и RHG — ruby hacking guide — он сильно помог на первых порах.
Не могу взять в толк, как же тогда вот этот бенчь? Причём проверенный мной уже на Ruby 2.1.2p95. От приведённого в ссылке мой результат отличается не сильно. Выполнение .select{ |i| i%2 == 0 }.map{ |i| i*2 } на миллионном массиве
Результат (real):
0.423104 # без lazy
1.065144 # с lazy

А вот результат увеличенной в два раза цепочке .select{ |i| i%2 == 0 }.map{ |i| i*2 }.select{ |i| i%4 == 0 }.map{ |i| i + 1 } и 50-ти миллионного массива:
52.351417 # без lazy
92.194890 # с lazy

Если увеличить цепочку ещё — то результат аналогичен. Идея хороша, но с реализацией уже где-то не сошлось.
О, прошу прощения, мой коммент выше вероятно пример неправильного использования lazy.
Sign up to leave a comment.

Articles