Ruby 1.9 GarbageCollector,GC.disable/enable

seb*_*seb 8 ruby garbage-collection ruby-on-rails

我正在开发一个Rails 2.3,Ruby 1.9.1 webapplication,它在每个请求之前进行了大量的计算.对于每个请求,它必须计算具有300个节点和~1000个边的图.图形及其所有节点,边和其他对象都为每个请求(~2000个对象)初始化 - 实际上它们是使用Marshal.load(Marshal.dump())从未计算的缓存图中克隆的.

性能在这里是一个很大的问题.现在整个请求平均需要150毫秒.然后我看到在请求期间,部分计算随机需要更长时间.假设这可能是GarbageCollector,我将请求包装在GC.disable和GC.enable中,以便请求等待使用garbagecollecting直到计算和渲染完成.

def query
  GC.disable
  calculate
  respond_to do |format| format.html {render} end
  GC.enable
end
Run Code Online (Sandbox Code Playgroud)

现在平均请求大约需要100毫秒(减少50毫秒).

但我不确定这是一个好的/稳定的解决方案,我认为这样做肯定有缺点.有没有人遇到过类似问题或看到上述代码有问题?

Mar*_*une 5

如果它使您的应用程序更快,那么使用它.

我会添加一个ensure语句,以便在引发任何异常时,您最终不会使用禁用的垃圾回收.

def query
  GC.disable
  calculate
  respond_to do |format| format.html {render} end
ensure
  GC.enable
end
Run Code Online (Sandbox Code Playgroud)


Mer*_*ost 1

没有真正的缺点,只是重新启用时 GC 运行时间会更长。

网络上有很多关于调整 Ruby GC 的文章。看看它们,也许你可以删除这些线条。=)

有没有办法可以缓存结果并每隔几分钟在后台重做计算?