我正在开发一个Rails 2.3,Ruby 1.9.1 webapplication,它在每个请求之前进行了大量的计算。对于每个请求,它必须计算具有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毫秒)。
但我不确定这是否是一个好的/稳定的解决方案,我认为这样做肯定有缺点。有没有人遇到过类似问题或看到上述代码有问题?
答案 0 :(得分:5)
如果它让您的应用更快,请使用它。
我会添加一个ensure
语句,这样如果引发任何异常,你就不会以禁用垃圾回收结束。
def query
GC.disable
calculate
respond_to do |format| format.html {render} end
ensure
GC.enable
end
答案 1 :(得分:1)
没有真正的缺点,除了重新启用GC需要更长的时间才能运行。
关于调整Ruby的GC,网上有很多文章。看看它们,也许你可以删除这些线条。 =)
你无法在几分钟内缓存结果并在后台重做计算?
答案 2 :(得分:0)
它可能看起来很愚蠢,但在这种情况下,我会尝试从你的ROR调用一个C函数。 这个解决方案非常硬,但它应该会给出惊人的性能结果;)
您使用红宝石的解决方案不是一个长期的热解决方案,它只是一个解决方案......