我有一个页面有几种形式,表单和字段的加载时间似乎比它应该慢。
我的表单看起来像这样
-@leaders = Leader.select("id, full_name")
-@managers = Leader.select("id, full_name")
=form_for organization, remote: true do |f|
=f.fields_for :projects, [project] do |project_fields|
Status:
=project_fields.collection_select :status_id, Status.all, :id, :title
Current Manager
=project_fields.fields_for :project_managers, [pm] do |project_manager_fields|
-# 50+ entries
=project_manager_fields.collection_select :manager_id, @managers, :id, :full_name
Current Lead
=project_fields.fields_for :project_leads, [pl] do |project_lead_fields|
-# 50+ entries
=project_lead_fields.collection_select :lead_id, @leaders, :id, :full_name
这只是一个人为的例子。我已预先加载所有内容,因此fields_for不会访问数据库。这产生了巨大的差异,但仍然太慢了。我也尝试缓存每个内容,使速度可以接受,但我不认为缓存是预期的解决方案。
我还能做些什么来让它更快地渲染?
ruby 1.9.2或1.9.3,Rails 3.2.6,sqlserver适配器(一切都比mysql慢),Ubuntu 10.04 VM(托管在windows 2k3中),4gb,3ghz xeon cpu
这在杂货/乘客的开发和生产上很慢,其他页面加载速度可以接受。
答案 0 :(得分:2)
最近,在优化Rails应用程序性能时,我发现一些Rails表单助手的速度非常慢。通过用原始字符串插值替换表单辅助调用,我能够将几个频繁使用的页面的渲染速度相乘。
要获取助手生成的HTML,请在Chrome中打开页面,按F12打开开发工具,进入元素,右键单击元素,然后选择"复制HTML"。然后将原始HTML复制到模板中,并根据需要使用#{}
字符串插值在正确的位置插入值。对于真实性令牌<input>
,请使用value="#{form_authenticity_token}"
。
这很难看,有些人甚至可能说是丑陋的,但它也很快。通过在一些关键位置应用此更改,以及DB索引的优化和一些其他更改,我能够使上述应用程序在同一服务器上处理3.6倍的负载!
答案 1 :(得分:0)
仅使用模型的必要字段呢?
=form_for organization, remote: true do |f|
=f.fields_for :projects, [project] do |project_fields|
Status:
=project_fields.collection_select :status_id, Status.find(:all,:select=>'id,title'), :id, :title
Current Manager
=project_fields.fields_for :project_managers, [pm] do |project_manager_fields|
-# 50+ entries
=project_manager_fields.collection_select :manager_id, Manager.find(:all,:select=>'id,full_name'), :id, :full_name
Current Lead
=project_fields.fields_for :project_leads, [pl] do |project_lead_fields|
-# 50+ entries
=project_lead_fields.collection_select :lead_id, Leader.find(:all,:select=>'id,full_name'), :id, :full_name
答案 2 :(得分:0)
看到有这么多表格,我猜这个页面本身太长了,不适合屏幕。用户肯定无法在短时间内处理如此多的信息。
那么,如果可能的话,为什么不首先加载必要的div?然后,您可以使用切换来显示Ajax需要的表单。