我有一个控制器动作需要10秒才能运行。大部分时间都花在一个大文件的视图中(超过1500行)。我该如何调试速度问题?
答案 0 :(得分:3)
Yuo可以试试NewRelic。我几年前使用过免费版本,你可以看到整体性能,尤其是慢速通话 据我所知,你只需要安装一个宝石,配置一些东西,这样做很好。
答案 1 :(得分:2)
Ruby和Rails拥有可以帮助您的基本分析工具。看看这个Rails指南:Performance Testing Rails Applications。
该页面描述了如何编写用于基准测试的测试用例,以防止性能下降以及如何进行性能分析,这可能很简单:
rails profiler 'Ruby.code.to.run'
如果不适合您,请考虑使用New Relic。但是我也会看看Rack-Bug(顺便说一句,它有一个Rails 3 branch用于Rails 3)。 Rack-Bug是一个调试工具栏,它为您提供了许多关于请求中花费时间的精彩指标,它在浏览器中直接执行,与正常响应一起,因此它是最不痛苦的。
现在,你所做的是错的:
因此,请考虑将此处理移至作业队列中。 Delayed_job非常可靠,维护得当,可以与Rails 3一起使用。
所以你的观点将注册一份新工作并返回。当工作完成后,你会在某个地方设置一个标志。然后通过特殊的API调用,您可以每隔几秒从客户端Javascript检查其完整性。完成后,您可以再次从Javascript中显示结果,重定向或开始下载等等。
如果以上不是一个选项(也许这是一个显示应该是即时报告的页面),您应该考虑的第一个瓶颈是执行的SQL查询,所以熟悉MySQL's DESCRIBE命令(或PostgreSQL's EXPLAIN)。通过这种方式可以轻松查看索引所在的位置。
答案 2 :(得分:2)
答案 3 :(得分:0)
我建议将视图的一些小部分包装到benchmark
块中,并在log / development.log中查看缓慢部分。
<% benchmark "Showing users" do %>
<!-- ... -->
<% end %>
<% benchmark "Performing some calculations" do %>
<!-- ... -->
<% end %>
最好的情况是你会找到一些花费90%时间的地方。然后,您可以使用它们来显着提高性能。