我正在开发一个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