Разработчикам Ruby очень повезло, поскольку им не нужно самим управлять памятью.
Помните, что ruby выделяет объекты, например что-то простое, как
100.times{ 'foo' }
выделяет 100 строковых объектов (строки являются изменяемыми, и каждая версия требует отдельного выделения памяти).
Убедитесь, что если вы используете библиотеку, выделяющую много объектов, другие альтернативы недоступны, и ваш выбор стоит заплатить за сборщик мусора. (у вас может не быть много запросов / с или может не заботиться о нескольких десятках мс на запросы).
Создание хеш-объекта действительно выделяет больше, чем объект, например
{'joe' => 'male', 'jane' => 'female'}
выделяет не 1 объект, а 7. (один хеш, 4 строки + 2 строки ключей)
Если вы можете использовать символьные ключи, так как они не будут собирать мусор. Однако, поскольку они не будут собирать мусор, вы должны убедиться, что не используете полностью динамические ключи, такие как преобразование имени пользователя в символ, иначе вы «утечете» память.
Пример: Где-то в вашем приложении вы применяете to_sym к имени пользователя, например:
hash[current_user.name.to_sym] = something
Когда у вас есть сотни пользователей, это может быть хорошо, но что происходит, если у вас есть миллион пользователей? Вот цифры:
ruby-1.9.2-head >
# Current memory usage : 6608K
# Now, add one million randomly generated short symbols
ruby-1.9.2-head > 1000000.times { (Time.now.to_f.to_s).to_sym }
# Current memory usage : 153M, even after a Garbage collector run.
# Now, imagine if symbols are just 20x longer than that ?
ruby-1.9.2-head > 1000000.times { (Time.now.to_f.to_s * 20).to_sym }
# Current memory usage : 501M
Имейте в виду, что никогда не преобразовывайте неконтролируемые аргументы в символ или проверяйте аргументы ранее, это может легко привести к отказу в обслуживании.
Также не забывайте избегать вложенных циклов глубиной более трех уровней, поскольку это затрудняет обслуживание. Ограничение вложенности циклов и функций тремя уровнями или меньше - хорошее практическое правило для поддержания производительности кода.
Вот несколько ссылок относительно:
http://merbist.com
http://blog.monitis.com