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

标签 ruby-on-rails ruby garbage-collection

我正在开发一个 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/

相关文章:

ruby-on-rails - 如何在 Ruby 中组合图像

ruby-on-rails - 使用 get 和 delete 运行 Rspec 测试时获取错误数量的参数(2 个为 0)

ruby - 类变量的 Attr_accessor

java - android中的来电中的变量被清除

javascript - 从 EcmaScript 使用 Wea​​kMap 时的计时问题注意事项

mysql - 如何在 ActiveRecord 中重新创建此查询

ruby-on-rails - 为什么我会收到 bcrypt-ruby gem 安装错误?

java - Tomcat垃圾回收不彻底

ruby-on-rails - 即使所有先前的请求都中止,jQuery AJAX 请求仍很慢

mysql - 开发中连接 Sphinx MySQL 时遇到问题