3

我似乎无法弄清楚为什么我的总渲染时间与我的活动记录时间 + 我的生产日志中列出的查看时间不匹配。

这是我的生产日志的输出:

在 12508 毫秒内完成 200 OK(查看:0.3 毫秒 | ActiveRecord:46.0​​ 毫秒)

这是我的控制器中的代码:

store = Store.find(:vanity_url => params[:vanity_url])
render :json => store.get_pages_with_includes
return false

在我的 Store.rb 模型中,我使用两种方法来渲染模型的 json 表示及其所有活动关系。这是急切的加载方法:

def eager_load_pages
    pages = Page.where(:store_id => self.id).includes(
        [{:menu_items => 
            [
                :sizes, 
                {:topping_groups => 
                    {:toppings => :sizes}
                }
            ]
        },
        {:combos => 
            {:combo_item_groups => 
                {:combo_items => 
                    [
                        :sizes,
                        {:topping_groups => 
                            {:toppings => :sizes}
                        }
                    ]
                }
            }
        }]
    ).order('position ASC')
    return pages
end

这是 to_json 方法

def get_pages_with_includes
    pages = self.eager_load_pages
    return pages.to_json({:include =>  
        [{:menu_items => 
            {:include =>
                {:topping_groups =>
                    {:include => 
                        {:toppings => 
                            {:include => 
                                :sizes
                            }
                        }
                    }
                }
            }
        },
        {:combos =>
            {:include =>
                {:combo_item_groups => 
                    {:include => 
                        {:combo_items =>
                            {:include => 
                                [:sizes, :topping_groups => 
                                    {:include => 
                                        {:toppings => 
                                            {:include =>
                                                :sizes
                                            }
                                        }
                                    }
                                ]
                            }
                        }
                    }
                }
            }
        }]
    })
end

所有的代码都在工作,我不确定我是否可以让它更有效率。我感到困惑的是为什么总页面加载时间甚至不接近运行查询所需的时间。谁能帮我吗?请??从技术上讲,该页面的加载时间应该少于 50 毫秒,但它需要 12508 毫秒!

任何帮助将非常感激!

----------UPDATE------------ 我从我的服务器运行 top 并注意到在这些查询期间 ruby​​ 占用了 100% 的 CPU。这里有什么想法吗?也许这指出了问题......?

4

1 回答 1

2

很可能在您的控制器中呈现为 JSON 的时间太长了。您要渲染多少条记录?如果您的 Ruby 进程占用了所有可用的 CPU,这意味着它与您的数据库不(直接)相关,但可能是以下任何一种:

  • 从数据库中实例化对象(如果您要检索 10,000 条记录);
  • 将这些对象呈现为 JSON。

查看您的页面加载时间,(Views: 0.3ms | ActiveRecord: 46.0ms)我会说这是对 JSON 的呈现。它没有显示在下面,Views因为您没有使用任何视图,而只是直接在控制器中调用渲染操作。

我建议您在您的应用程序中添加一些工具(例如 New Relic RPM),或者甚至是简单的基准测试方法来找出需要这么长时间的原因。

您可能还想考虑使用更快的 JSON 解析器/渲染器而不是默认的。检查multi_json宝石。

于 2013-05-31T10:33:52.360 回答