В Ruby, если хеш не понадобится позже, лучше ли использовать hash.merge! ({...}) вместо hash.merge ({...})? - PullRequest
1 голос
/ 03 августа 2010

Это происходит в Ruby on Rails View, где есть хеш для другого партиала. Этот хеш имеет около 20 пар ключ / значение.

Есть (в HAML)

- if (some_conditon)
  = render :partial => 'some_name', :locals => a_hash.merge({ :extra => true })
- else
  -# a lot more processing, including concatenating the partials and return as json
  - some_var.each do |item| 
    - result_html << (render :partial => 'some_name', :locals => a_hash )
    -# etc
  - response.content_type = "application/json"
  = result_html.to_json

Итак, вопрос в том, должен ли merge быть записан как merge!? Поскольку в дальнейшем он больше не нужен, если создается новый хеш, много времени будет потрачено на создание этого нового хэша (20 элементов в хеше). Если модификация на месте сделана, она может использовать существующую хеш-структуру и добавить к ней один элемент, что будет намного быстрее?

Ответы [ 4 ]

2 голосов
/ 03 августа 2010

Это микрооптимизация. Как и во всех подобных вопросах, вопрос «Должен ли я…?» отвечает профилированием и проверкой, занимает ли A) рассматриваемый код много времени, а B) изменение приводит к значительному ускорению. Если A не соответствует действительности, не переходите к B. Если B не соответствует действительности, изменение не стоит делать код менее чистым.

Что касается соображений безопасности, вам нужно не только подумать, собираетесь ли вы использовать этот хеш позже в методе, но и иметь ли какие-либо другие объекты ссылки на хеш. Если вы получили этот хеш от другого объекта, и этот объект хранит его в переменной экземпляра, добавление ключей к хешу заставит другой объект видеть измененную версию.

1 голос
/ 03 августа 2010

Если вы уверены, что изменение существующего хэша не является проблемой, тогда вы наверняка можете использовать слияние !.Однако я не уверен, будет ли это «намного» быстрее, чем просто слияние.копирование 20 или около того объектов, вероятно, не является чрезвычайно трудоемкой операцией.Но, если это вызывает озабоченность, вы можете сравнить различные реализации и посмотреть, сколько вы получите, сделав одну над другой.

1 голос
/ 03 августа 2010

если вы беспокоитесь о скорости, вы можете проверить это очень легко, в противном случае используйте merge ()

1 голос
/ 03 августа 2010

Возможно, в данный момент функция не понадобится позже, но я не удивлюсь, если вам понадобится расширить представление через шесть месяцев.И через шесть месяцев вы можете быть очень удивлены, обнаружив :extra => true, вставленный в ваш хэш после этого if/else/end блока.

Так что спросите себя, что вас больше удивит через шесть месяцев: найти:extra => true в вашем хэше или не нахождение :extra => true в вашем хэше.Без полных деталей трудно сказать, какой из них я бы предпочел, я могу представить, что оба пути имеют смысл.

Я бы не стал беспокоиться о скорости, если бы ваше профилирование не продемонстрировало, что создание нового хэша представляет собой измеримое количествообработка.

...