2010-04-20 53 views
8

我正在开发一个Rails 2.3,Ruby 1.9.1 web应用程序,它在每次请求之前执行相当多的计算。对于每个请求,它必须计算一个具有300个节点和〜1000个边的图。该图及其所有节点,边缘和其他对象都针对每个请求进行初始化(〜2000个对象) - 实际上,它们是使用Marshal.load(Marshal.dump())从未计算的缓存图形中克隆的。Ruby 1.9 GarbageCollector,GC.disable/enable

性能在这里是一个相当大的问题。现在整个请求平均需要150ms。然后我看到,在请求期间,部分计算随机需要更长的时间。假设这可能是垃圾收集器踢入,我将请求包装在GC.disable和GC.enable中,以便请求等待垃圾收集,直到计算和渲染完成。

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

平均请求现在需要大约100ms(少50ms)。

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

回答

1

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

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

您无法缓存结果并每隔几分钟就在背景上重新计算一次?

+0

不可能缓存,计算取决于用户输入。 – seb 2010-04-20 12:28:13

0

它可能看起来很愚蠢,但在这种情况下,我会尝试从ROR调用C函数。 该解决方案是相当硬派,但它应该给惊艳表现的结果;)

您与红宝石的解决方案是不是一个长期的解决方案千卡它只是一个修复...

5

如果它使你的应用程序更快,然后使用它。

我会添加一个ensure语句,以便如果发生任何异常,最终不会收到禁用的垃圾回收。

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

这非常有帮助。 TNX – seb 2010-04-20 21:49:50