#ruby
#ruby
Вопрос:
Короче говоря, выше ли стоимость (по времени и процессору) вызова kind_of? дважды или создать новый массив с одним значением, а затем выполнить итерацию по нему? Приведенная ниже «предыстория» просто описывает, почему мне нужно это знать, но не является обязательным чтением для ответа на вопрос.
Предыстория:
У меня есть куча данных о местоположении. Пары широта / долгота и название места, которое они представляют. Мне нужно отсортировать эти значения широты / широты по расстоянию от другой пары широты / широты, предоставленной пользователем. Мне приходится вычислять расстояния на лету, а они раньше не были известны.
Я подумал, что было бы легко сделать это, добавив distance => placename
map к хэшу, затем получить набор ключей и отсортировать его, затем зачитать значения в таком порядке. Однако существует вероятность того, что два расстояния будут равны, что сделает два ключа равными друг другу.
Я придумал два решения для этого, либо я сопоставляю
if hash.has_key?(distance)
hash[distance].kind_of? Array
? hash[distance] << placename
: hash.merge!({distance => [hash[distance], placename]})
else
hash.merge!({distance => placename})
end
затем при чтении значений я проверяю
hash[distance] kind_of? Array ? grab the placename : iterate through hash and grab all placenames
каждый раз. Или я мог бы сделать каждое значение массивом с самого начала, даже если у него только одно имя места.
Комментарии:
1. Вероятно, сложно понять ваш вопрос. Возможно, вы можете улучшить это.
2. Я отредактировал вопрос, надеюсь, теперь его легче читать.
3. Почему бы вам не провести тест, сравнивающий два метода? Кроме того, я бы не советовал использовать многострочный троичный файл, для этого и существуют
if
инструкции.4. Я знаю.. вложенные операторы if в ruby просто попадают ко мне по какой-то неизвестной причине… Как бы можно было провести сравнительный анализ чего-то подобного?
Ответ №1:
Вероятно, вы потратили на обдумывание проблемы больше времени, чем когда-либо сэкономите в процессорном времени. Время разработки (как ваше, так и других, кто будет поддерживать код, когда вы уйдете) часто намного дороже циклов процессора. Сосредоточьтесь на ясности кода.
Если вы получаете указания на то, что ваш код является узким местом, может быть хорошей идеей сравнить его, но не забудьте сравнить как до, так и после любых вносимых вами изменений, чтобы убедиться, что вы действительно улучшаете код. Удивительно, как часто «оптимизации» вообще не улучшают код, просто усложняя его чтение.
Ответ №2:
Честно говоря, это звучит как очень незначительная проблема с производительностью, поэтому я бы сказал, просто выбирайте то, что вам удобнее.
Если вы действительно считаете, что это оказывает реальное влияние на производительность (и, честно говоря, есть другие области Ruby, о скорости которых вам следует больше беспокоиться), сведите свою проблему к простейшей форме, которая все еще напоминает вашу проблему, и используйте модуль Benchmark:
http://www.ruby-doc.org/stdlib/libdoc/benchmark/rdoc/index.html
Ответ №3:
Я бы поспорил, что вы достигнете как более высокой производительности, так и лучшей разборчивости, используя встроенный Enumerable#group_by
метод.
Как говорили другие, вполне вероятно, что это не узкое место, что выигрыш в любом случае будет незначительным и что вам следует сосредоточиться на других вещах!