Ich entwickle eine Rails 2.3, Ruby 1.9.1 Webapplikation, die vor jeder Anfrage eine Menge Berechnungen durchführt. Für jede Anfrage muss ein Graph mit 300 Knoten und ~ 1000 Kanten berechnet werden. Das Diagramm und alle seine Knoten, Kanten und anderen Objekte werden für jede Anfrage initialisiert (~ 2000 Objekte) - tatsächlich werden sie aus einem nicht berechneten Cache-Graphen mit Marshal.load (Marshal.dump()) geklont.Ruby 1.9 GarbageCollector, GC.disable/enable
Leistung ist ein ziemliches Problem hier. Im Moment dauert die gesamte Anfrage durchschnittlich 150ms. Ich sah dann, dass während einer Anfrage Teile der Berechnung nach dem Zufallsprinzip länger dauern. Unter der Annahme, dass dies der GarbageCollector sein könnte, habe ich die Anfrage in GC.disable und GC.enable verpackt, so dass die Anfrage mit dem Müllsammeln wartet, bis die Berechnung und das Rendering beendet sind.
def query
GC.disable
calculate
respond_to do |format| format.html {render} end
GC.enable
end
Die durchschnittliche Anforderung dauert jetzt etwa 100 ms (50 ms weniger).
Aber ich bin mir nicht sicher, ob dies eine gute/stabile Lösung ist, ich nehme an, dass es Nachteile haben muss. Hat jemand Erfahrung mit einem ähnlichen Problem oder sieht er Probleme mit dem obigen Code?
Cache nicht möglich, die Berechnung hängt von Benutzereingaben ab. – seb