Ruby 1.9 GarbageCollector, GC.disable/enable

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

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

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

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

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

8
задан seb 20 April 2010 в 11:18
поделиться

3 ответа

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

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

def query
  GC.disable
  calculate
  respond_to do |format| format.html {render} end
ensure
  GC.enable
end
5
ответ дан 5 December 2019 в 22:17
поделиться

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

Ваше решение с рубином не является долгим термином, это просто исправление ...

0
ответ дан 5 December 2019 в 22:17
поделиться

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

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

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

1
ответ дан 5 December 2019 в 22:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: