Ruby 1.9 垃圾回收器,GC.disable/enable

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

现在,平均请求时间约为100毫秒(比之前少了50毫秒)。

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

3个回答

5

如果可以提高您的应用程序速度,那么请使用它。

我会添加一个ensure语句,以便如果引发任何异常,您不会出现禁用垃圾收集的情况。

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

1

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

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

你没有办法缓存结果并在每几分钟后重新计算吗?


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

0

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

您使用Ruby的解决方案不是长期解决方案,只是一个临时修复...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接