我正在开发一个Rails 2.3,Ruby 1.9.1的Web应用程序,在每个请求之前需要进行大量计算。对于每个请求,它都必须计算一个具有300个节点和约1000条边的图形。该图形及其所有节点、边缘和其他对象都是为每个请求初始化的(~2000个对象) - 实际上它们是使用Marshal.load(Marshal.dump())从未经计算的缓存图形克隆而来。
性能是一个相当大的问题。现在整个请求平均需要150毫秒。我发现在请求期间,部分计算会随机花费更长的时间。假设这可能是垃圾回收器启动,因此我将请求包装在GC.disable和GC.enable中,以便请求等待垃圾回收直到计算和呈现完成。
性能是一个相当大的问题。现在整个请求平均需要150毫秒。我发现在请求期间,部分计算会随机花费更长的时间。假设这可能是垃圾回收器启动,因此我将请求包装在GC.disable和GC.enable中,以便请求等待垃圾回收直到计算和呈现完成。
def query
GC.disable
calculate
respond_to do |format| format.html {render} end
GC.enable
end
现在,平均请求时间约为100毫秒(比之前少了50毫秒)。
但我不确定这是否是一个好的/稳定的解决方案,我认为这样做可能存在缺点。有没有人遇到过类似的问题或者看到上面的代码存在问题?