Ruby on rails Ruby 1.9垃圾收集器,GC.disable/enable

Ruby on rails Ruby 1.9垃圾收集器,GC.disable/enable,ruby-on-rails,ruby,garbage-collection,Ruby On Rails,Ruby,Garbage Collection,我正在开发一个Rails2.3、Ruby1.9.1WebApplication,它在每个请求之前都会进行大量计算。对于每个请求,它必须计算一个具有300个节点和~1000条边的图。每个请求(~2000个对象)都会初始化图形及其所有节点、边和其他对象,实际上它们是使用Marshal.load(Marshal.dump())从未计算的缓存图形克隆而来的 性能在这里是一个相当大的问题。现在整个请求平均需要150毫秒。然后我看到在一个请求过程中,部分计算会随机花费更长的时间。假设这可能是GarbageC

我正在开发一个Rails2.3、Ruby1.9.1WebApplication,它在每个请求之前都会进行大量计算。对于每个请求,它必须计算一个具有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
现在,平均请求大约需要100毫秒(少50毫秒)


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

没有真正的缺点,除非重新启用GC将需要更长的时间才能运行

web上有许多关于调优Ruby的GC的文章。看一看,也许你可以删除这些行


您无法缓存结果并每隔几分钟在后台重做一次计算?

这可能看起来很愚蠢,但在这种情况下,我将尝试从您的ROR调用C函数。 此解决方案是非常核心的,但它应该提供惊人的性能结果;)


你的ruby解决方案不是一个很长的therm解决方案,它只是一个补丁…

如果它能让你的应用程序更快,那么就使用它

我将添加一个
sure
语句,以便在引发任何异常时,不会导致禁用垃圾收集

def query
  GC.disable
  calculate
  respond_to do |format| format.html {render} end
ensure
  GC.enable
end

无法缓存,计算取决于用户输入。