我正在开发一个 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 毫秒)。
但我不确定这是否是一个好的/稳定的解决方案,我认为这样做肯定有缺点。是否有人遇到过类似问题或发现上述代码存在问题?
最佳答案
如果它能让您的应用更快,那就使用它。
我会添加一个 ensure
语句,这样如果出现任何异常,您就不会以禁用垃圾回收而告终。
def query
GC.disable
calculate
respond_to do |format| format.html {render} end
ensure
GC.enable
end
关于ruby-on-rails - Ruby 1.9 垃圾收集器,GC.disable/enable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2674563/