Ruby 1.9 GarbageCollector, GC.disable / enable - PullRequest
       7

Ruby 1.9 GarbageCollector, GC.disable / enable

8 голосов
/ 20 апреля 2010

Я разрабатываю веб-приложение на Rails 2.3, Ruby 1.9.1, которое выполняет кучу вычислений перед каждым запросом. Для каждого запроса необходимо рассчитать граф с 300 узлами и ~ 1000 ребрами. Граф и все его узлы, ребра и другие объекты инициализируются для каждого запроса (~ 2000 объектов) - фактически они клонируются из неисчисленного кэшированного графа с использованием Marshal.load (Marshal.dump ()).

Производительность - довольно серьезная проблема. Прямо сейчас весь запрос занимает в среднем 150 мс. Затем я увидел, что во время запроса отдельные части вычислений занимают больше времени. Предполагая, что это может быть включением GarbageCollector, я обернул запрос в GC.disable и GC.enable, так что запрос ожидает сбора мусора до завершения вычислений и рендеринга.

def query
  GC.disable
  calculate
  respond_to do |format| format.html {render} end
  GC.enable
end

Средний запрос теперь занимает около 100 мс (на 50 мс меньше).

Но я не уверен, что это хорошее / стабильное решение, я предполагаю, что в этом должны быть недостатки. Кто-нибудь имеет опыт работы с подобной проблемой или видит проблемы с приведенным выше кодом?

Ответы [ 3 ]

5 голосов
/ 20 апреля 2010

Если оно делает ваше приложение быстрее, используйте его.

Я бы добавил оператор ensure, чтобы при возникновении какого-либо исключения у вас не было отключенной сборки мусора.

def query
  GC.disable
  calculate
  respond_to do |format| format.html {render} end
ensure
  GC.enable
end
1 голос
/ 20 апреля 2010

Никаких реальных недостатков, за исключением того, что при повторном включении ГХ будет работать дольше.

В Интернете есть ряд статей о настройке Ruby's GC. Посмотрите на них, и, возможно, вы можете удалить эти строки. =)

Нет никакого способа, которым вы можете кэшировать результаты и каждые несколько минут повторять вычисления в фоновом режиме?

0 голосов
/ 20 апреля 2010

Это может выглядеть глупо, но в этом случае я попытаюсь вызвать функцию C из вашего ROR.Это решение довольно хардкорное, но оно должно дать потрясающие результаты производительности;)

Ваше решение с ruby ​​- это не долговременное решение, а просто исправление ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...