Jim*_*y Z 5 ruby performance ruby-on-rails ruby-1.9
我有一个Rails 2.3.8应用程序,其动作可以从数据库中提取大量数据,并在300-600个部分中呈现它(递归渲染树型结构).对一个请求进行基准测试可以使我的响应时间大约为7秒.
我认为将我的Ruby版本从1.8升级到1.9会给我带来性能提升,但是当我对1.9版本进行基准测试时,我的响应时间大约为9秒(比1.8慢2秒).这对我来说非常令人惊讶.
哪些因素会导致Ruby 1.9执行速度比Ruby 1.8慢?
下面是日志文件的一部分.
Ruby 1.8
Rendered family_index/descendants/_fi_hover (0.5ms)
Rendered family_index/descendants/_descendant (4.6ms)
Rendered search/_search_div (0.1ms)
Rendered family_index/descendants/_fi_hover (0.7ms)
Rendered family_index/descendants/_descendant (4.7ms)
Rendered search/_search_div (0.1ms)
Rendered family_index/descendants/_fi_hover (0.5ms)
Rendered family_index/descendants/_descendant (4.5ms)
Rendered family_index/descendants/_fi_hover (0.5ms)
Rendered family_index/descendants/_descendant (37.9ms)
Rendered family_index/surname_groups/_pedigree (3162.9ms)
Rendered shared/_headers (4.6ms)
Rendered shared/_new_messages (0.6ms)
Rendered shared/_home_logo (1.1ms)
Rendered shared/_login_box (4.0ms)
Rendered shared/_navigation (13.6ms)
Rendered shared/_flash_messages (0.8ms)
Rendered shared/_footer (1.0ms)
Rendered shared/_analytics (0.8ms)
Completed in 4552ms (View: 3352, DB: 147) | 200 OK [http://localhost/family_index/surname_groups/31]
Run Code Online (Sandbox Code Playgroud)
Ruby 1.9
Rendered family_index/descendants/_fi_hover (0.3ms)
Rendered family_index/descendants/_descendant (1.9ms)
Rendered search/_search_div (0.1ms)
Rendered family_index/descendants/_fi_hover (0.4ms)
Rendered family_index/descendants/_descendant (2.0ms)
Rendered search/_search_div (0.1ms)
Rendered family_index/descendants/_fi_hover (0.3ms)
Rendered family_index/descendants/_descendant (1.9ms)
Rendered family_index/descendants/_fi_hover (0.3ms)
Rendered family_index/descendants/_descendant (15.1ms)
Rendered family_index/surname_groups/_pedigree (762.8ms)
Rendered shared/_headers (2.6ms)
Rendered shared/_new_messages (0.7ms)
Rendered shared/_home_logo (0.9ms)
Rendered shared/_login_box (3.6ms)
Rendered shared/_navigation (7.3ms)
Rendered shared/_flash_messages (0.7ms)
Rendered shared/_footer (0.8ms)
Rendered shared/_analytics (0.6ms)
Completed in 5736ms (View: 942, DB: 128) | 200 OK [http://localhost/family_index/surname_groups/31]
Run Code Online (Sandbox Code Playgroud)
看来Ruby 1.9正在更快地渲染视图和处理数据库,但仍然在慢慢完成请求.
Ruby 1.8:
Completed in 4552ms (View: 3352, DB: 147) | 200 OK [http://localhost/family_index/surname_groups/31]
Run Code Online (Sandbox Code Playgroud)
Ruby 1.9:
Completed in 5736ms (View: 942, DB: 128) | 200 OK [http://localhost/family_index/surname_groups/31]
Run Code Online (Sandbox Code Playgroud)
更新10-26-2010
我在代码中找到了瓶颈.它来自一个使用延迟加载的关联加载大量ActiveRecord项目的行.数据库时间很短,但我猜测所有的对象分配都会造成损失.这是我的协会:
has_many :deep_branches,
:class_name => "FamilyIndex::Branch",
:include => {
:descendant => [:state, :county, {:wives => {:marriage => [:state,:county,:reference] }}, :reference, {
:children => [:state, :county, {:wives => {:marriage => [:state,:county,:reference] }}, :reference, {
:children => [:state, :county, {:wives => {:marriage => [:state,:county,:reference] }}, :reference, {
:children => [:state, :county, {:wives => {:marriage => [:state,:county,:reference] }}, :reference] # add marriages to this data
}]
}]
}]
}
Run Code Online (Sandbox Code Playgroud)
如果不进行预先加载,完成操作大约需要40秒才能完成,因此使用:include会使性能提高10倍.还在寻找一种加快速度的方法.也许缓存是从这里开始的唯一方法.
1.9可以比1.8慢的一个区域是字符串处理.
由于1.9具有适当的unicode支持索引或切片,因此unicode编码的字符串可能比1.8更长,因为在1.8中string[i]只返回第ith个字节,而在1.9中它必须通过字符串才能找到第ith个字符.
如果你进行了大量的字符串处理并且不需要正确的unicode支持,你可以将编码设置为ASCII或可能是二进制,这将大大加快字符串处理速度.
因此,我的请求花费最长时间处理的区域是通过 ActiveRecord 的延迟加载加载的大量数据(请参阅问题中列出的关联)。我对 ActiveRecord 2.3.8 的内部结构不够熟悉,所以最终我不确定是什么导致了“缓慢”。
\n\n我最终做了我自己类型的急切加载\xe2\x80\x94,获取一个查询中的所有人员记录、一个查询中的所有状态以及我需要的其他关联对象,将它们放入哈希中,然后将它们拼接到树中结构。
\n\n这极大地提高了性能,将请求时间缩短至 1-1.5 秒。这一改进有利于在 1.8 和 1.9 中运行的应用程序,现在我的应用程序在 1.9 中运行得更快一些。
\n\n感谢大家的帮助!
\n| 归档时间: |
|
| 查看次数: |
622 次 |
| 最近记录: |