我正在開發一個Rails 2.3,Ruby 1.9.1 web應用程序,它在每次請求之前執行相當多的計算。對於每個請求,它必須計算一個具有300個節點和〜1000個邊的圖。該圖及其所有節點,邊緣和其他對象都針對每個請求進行初始化(〜2000個對象) - 實際上,它們是使用Marshal.load(Marshal.dump())從未計算的緩存圖形中克隆的。Ruby 1.9 GarbageCollector,GC.disable/enable
性能在這裏是一個相當大的問題。現在整個請求平均需要150ms。然後我看到,在請求期間,部分計算隨機需要更長的時間。假設這可能是垃圾收集器踢入,我將請求包裝在GC.disable和GC.enable中,以便請求等待垃圾收集,直到計算和渲染完成。
def query
GC.disable
calculate
respond_to do |format| format.html {render} end
GC.enable
end
平均請求現在需要大約100ms(少50ms)。
但我不確定這是否是一個好的/穩定的解決方案,我認爲這樣做肯定有缺點。有沒有人有類似問題的經驗,或看到上述代碼的問題?
不可能緩存,計算取決於用戶輸入。 – seb 2010-04-20 12:28:13