Действительно ли распределение переменных в Ruby дорого, или оно оптимизирует цепные строковые методы?

У меня есть следующий метод, который я написал для Project Euler - Problem 36 . Все, что он делает, - это суммирует все числа меньше 1 000 000, которые являются палиндромами как по основанию 10, так и по основанию 2.

def problem_36
  (1...1_000_000).select do |n|
    n.to_s == n.to_s.reverse && n.to_s(2) == n.to_s(2).reverse
  end
end

Теперь это работает и дает правильный результат чуть более чем за 1 секунду. Я хотел сократить время до 1 секунды, поэтому решил уменьшить количество преобразований чисел в строки. Поэтому я внес следующие изменения:

def problem_36
  (1...1_000_000).select do |n|
    base10 = n.to_s
    base2  = n.to_s(2)
    base10 == base10.reverse && base2 == base2.reverse
  end
end

Проблема в том, что эта версия на самом деле работает примерно на 50% медленнее , чем исходная. Итак, вопрос в следующем: действительно ли так медленно выделяются эти две переменные? Или Ruby оптимизирует вызовы связанных методов?

7
задан Zero Piraeus 22 January 2015 в 18:18
поделиться