Я разрабатываю веб-приложение на 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 мс меньше).
Но я не уверен, что это хорошее / стабильное решение, я предполагаю, что в этом должны быть недостатки. Кто-нибудь имеет опыт работы с подобной проблемой или видит проблемы с приведенным выше кодом?