2013-08-02 2 views
0

У меня есть функция, ниже которой генерируется набор комбинаций для массива на разных длинах, определенных диапазоном. Я хотел бы получить данные о процессе объединения, который будет включать время, необходимое для обработки комбинаций. Учитывая следующее:Как вычислить продолжительность функции объединения массива в Ruby

source = ("a".."z").to_a 
range = 1..7 

в команду для генерации комбинаций заключается в следующем:

combinations = (range).flat_map do |size| 
    source.combination(size).to_a 
    end 

Эта команда занимает около 5 секунд, чтобы работать на моей машине, и генерирует 971,711 комбинации. Однако, когда я пытаюсь выполнить это в контексте функции ниже:

def combinations(source, range) 
    time_start = Time.now 

    combinations = (range).flat_map do |size| 
    source.combination(size).to_a 
    end 

    time_elapsed = (Time.now - time_start).round(1) 
    puts "Generated #{combinations.count} in #{time_elapsed} seconds." 
    return combinations 
end 

source = ("a".."z").to_a 
range = 1..7 

combinations(source, range) 

Функция почти сразу выдает:

Generated 971711 in 0.1 seconds. 

... и затем 5 секунд возвращает комбинации. Что тут происходит? И как я могу рассчитать продолжительность времени, необходимого для обработки комбинаций?

+1

попробуйте 'combination.to_a' в области с часами. Может быть, он ленив из-за бесконечных диапазонов? –

ответ

0

Когда я запускаю свой код на рубин 2.0.0p247 на 12.04 32-битной машине Ubuntu, я получаю выход:

Generated 971711 in 0.6 seconds. 

и программа завершает работу сразу же после этого.

Поскольку в программе есть только одна строка puts, что вы подразумеваете под ", а затем через 5 секунд возвращает комбинации"? Есть ли еще код, который вы нам не показываете? Какой рубиновый интерпретатор вы используете? Какая операционная система? Не могли бы вы предоставить полный код, если вы еще этого не сделали?

Если вы хотите изучить это больше, я рекомендую попробовать rblineprof или ruby-prof.

+0

Привет, Дэвид. Я запускаю ruby ​​1.9.3p429 на Mac OS X 10.8.4. Когда я говорю, что он возвращается через 5 секунд, я имел в виду, что все комбинации выводятся в irb. Спасибо за ссылки, я проверю их. – mayatron

+1

ОК, поэтому вы запускаете это в IRB. Похоже, что требуется 5 секунд или около того, чтобы форматировать строку, представляющую комбинации 971k, до того, как она будет напечатана на экране. Это неудивительно. –

0

Таким образом, проблема заключается в том, что рубин занимает около 5 секунд, чтобы иметь возможность загружать и отображать информацию в IRB, но «Сгенерировано X за Y секунд». информация действительно правильна и работает. Это было меньше, чем я ожидал, потому что меня смутило разницу между временем, необходимым для вычисления комбинаций, и временем, требуемым для загрузки, и начала отображения вывода комбинаций.