Я разрабатываю направляющие 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 мс меньше).
Но я не уверен, если это - хорошее/стабильное решение, я предполагаю, что должны быть недостатки, делающие это. Кто-либо имеет опыт с подобной проблемой или видит проблемы с вышеупомянутым кодом?
Если это ускоряет работу вашего приложения, используйте его.
Я бы добавил оператор sure
, чтобы в случае возникновения какого-либо исключения вы не отключили сборку мусора.
def query
GC.disable
calculate
respond_to do |format| format.html {render} end
ensure
GC.enable
end
Это может показаться глупым, но в этом случае я попытаюсь вызвать функцию C из вашего ROR. Это решение довольно сложное но это должно дать потрясающие результаты;)
Ваше решение с рубином не является долгим термином, это просто исправление ...
Никаких реальных недостатков, кроме того, что при повторном включении GC потребуется больше времени на выполнение.
В Интернете есть множество статей о настройке GC Ruby. Посмотрите на них, и, возможно, вы сможете убрать эти строки. =)
Нет ли способа кэшировать результаты и выполнять расчеты в фоновом режиме каждые несколько минут?