Какая из этих двух форм инициализации массива лучше в Ruby?Какая из этих инициализаций массива лучше в Ruby?
Метод 1:
DAYS_IN_A_WEEK = (0..6).to_a
HOURS_IN_A_DAY = (0..23).to_a
@data = Array.new(DAYS_IN_A_WEEK.size).map!{ Array.new(HOURS_IN_A_DAY.size) }
DAYS_IN_A_WEEK.each do |day|
HOURS_IN_A_DAY.each do |hour|
@data[day][hour] = 'something'
end
end
Способ 2:
DAYS_IN_A_WEEK = (0..6).to_a
HOURS_IN_A_DAY = (0..23).to_a
@data = {}
DAYS_IN_A_WEEK.each do |day|
HOURS_IN_A_DAY.each do |hour|
@data[day] ||= {}
@data[day][hour] = 'something'
end
end
Разница между первым способом и вторым способом, является то, что второй не выделяет память на начальном этапе. Я чувствую, что второй из них немного уступает, когда дело доходит до производительности из-за большого количества копий Array, которые должны произойти.
Однако, в Ruby нет прямой информации о том, что происходит. Итак, если кто-то может объяснить мне, что лучше, было бы здорово!
Благодаря
Вы считаете, что делаете что-то вроде 'time ruby myscript.rb', чтобы узнать, что быстрее? Помните, что старая пословица «мера дважды, разрезанная один раз» из плотницких? При вычислении это «мера один раз, не тратьте время на ваше задание». –
@JUST МОЙ правильный МНЕНИЕ: меня беспокоит не только то, что происходит быстрее, но я также обеспокоен тем, что происходит за кулисами. Смотрите, на C, Java всякий раз, когда я инициализирую массив, я уверен, что его смежное место памяти захвачено в памяти. И если нужна динамически растущая версия, в ней много экземпляров массива. Итак, мне было просто любопытно узнать, какая будет лучшая практика. – bragboy
@Bragaadeesh: Вы должны научиться проскальзывать своего внутреннего уродца, кузнечика. : D Сначала убедитесь, что ваш код является правильным и поддерживаемым. Тогда беспокойтесь о производительности, нанося ущерб ремонтопригодности (но ** никогда не ** корректность!) В ограниченных, хорошо документированных областях только при необходимости.На языке, подобном Ruby, вы можете улучшить производительность алгоритмически (лучший выбор), используя трюки кода (менее оптимальные) или прыгая вниз в реализацию C, если это абсолютно необходимо (последний, отчаянный курорт). Однако сделайте это в конце реализации, но не раньше, чем вы начнете. –