Ruby on rails RubyonRails4性能低下

Ruby on rails RubyonRails4性能低下,ruby-on-rails,ruby,ruby-on-rails-3,performance,ruby-on-rails-4,Ruby On Rails,Ruby,Ruby On Rails 3,Performance,Ruby On Rails 4,升级到Rails后,我发现了严重的性能问题 我最近将我的项目从Rails 2和Ruby 1.8升级到Rails 4和Ruby 2.0。通过阅读互联网上的文章,我了解到升级应该能够提供出色的性能改进(高达30%)。不幸的是,我发现在某些情况下,性能要差得多,例如,以前需要20秒左右的一些报告,现在需要40秒 我看到一些帖子说垃圾收集可能是个问题。在使用了一些推荐的设置后,我发现一些较长的报告实际上较短,但较短的报告仍然糟糕得多 作为升级的一部分,我已经转向使用不引人注目的javascript进行视

升级到Rails后,我发现了严重的性能问题

我最近将我的项目从Rails 2和Ruby 1.8升级到Rails 4和Ruby 2.0。通过阅读互联网上的文章,我了解到升级应该能够提供出色的性能改进(高达30%)。不幸的是,我发现在某些情况下,性能要差得多,例如,以前需要20秒左右的一些报告,现在需要40秒

我看到一些帖子说垃圾收集可能是个问题。在使用了一些推荐的设置后,我发现一些较长的报告实际上较短,但较短的报告仍然糟糕得多

作为升级的一部分,我已经转向使用不引人注目的javascript进行视图渲染,但这似乎不会导致性能问题——大部分时间都花在模型上

有人知道我是否丢失了一些配置“gotchas”吗?是否有其他人因升级而出现性能问题


提前谢谢

升级中可能总会出现边缘情况,某些类型的操作运行较慢,而其他类型的操作运行较快。最好遵循常规的性能调优技术,使用Oink gem和NewRelic等工具来分析最慢的问题

严格来说,通常最好在升级之前收集尽可能多的性能分析数据,这样您就可以判断特定操作是否有更高的内存消耗、更多/更慢的垃圾收集、不同的生成SQL(来自activerecord升级)、创建更多的对象。例如,使用升级后评测,很难将数据放入上下文中,这样您就可以判断对于给定操作创建30个post对象是否正常

关于迫不及待的加载,我们发现bullet是获得正确级别的非常有用的宝石。当然,你是对的,这不一定是Rails的3/4问题

对我们来说,另一个难点是不仅要减少查询的数量,而且要小心我们是否真的需要创建一个对象。有时,您可以不创建对象而直接检索数据以显示。此外,我们现在非常小心(例如)隐式运行:

select * from books where client_id = 1 order by name
。。。为了创建书名下拉列表,我们可以:

select id, name from books where client_id = 1 order by name
它在Rails端的效率大大提高,即使在数据库端的差异有时很小(在数据库端是100ms vs 20ms,但在Rails端是2000ms vs 500ms)


同样,Rails 3/4可能不相关,除非Rails 4中有一个怪癖使得它的效率更低。

发布一个git url。它可能是特定于项目的。我使用过rails 2、3和4,但我没有注意到有太多的速度性能,而不是负面性能。您可能尚未完全优化或正确转换您的项目。是否使用?Shrav,谢谢您的回复。不幸的是,我不能发布代码。但是,我还没有采取任何步骤来优化代码。你是说在ruby编译等方面吗?user2422869,不,我不知道t@MattThomas你终于想出什么办法了吗?很长时间了,但最近我做了这种升级,我注意到一切都变慢了!(3.2->4->4.2)谢谢大卫。我已经安装了RubyProf分析器。除了在调试模式下运行外,它还告诉我在模型代码中循环使用了大量CPU时间,并生成了大量查询。我已经采取了一些步骤,通过使用即时加载来减少总查询量。虽然它减少了查询,但我仍然看不到有多大的改进。它也没有解释为什么Rails在开箱即用时工作得较慢。但也许你是对的,我应该试着回到一个旧版本,并获得时间/配置文件结果。这是一些非常好的建议,大卫,我还没有听说Bullet,但我会努力得到它。只归还你需要的东西也很有趣。使用ActiveRecord,目前大多数情况下都会检索所有列。是的,这是ORM体系结构中常见的性能问题,但超出了数据库级别的效率。我认为,绩效问题的主要问题是准确的衡量、有效的比较,以及关注显示最大可能的效益与努力比的问题。到目前为止,我还没有尝试过只选择特定属性的想法,但这似乎是个好主意。默认情况下,ActiveRecord检索所有列,但我想指出,您可以这样做,将其限制为所需的列:record=record.find(:first,:select=>'id,report_date',:conditions=>['id=?',1]);然后您可以像往常一样使用ORM访问所选列,只有未选择的列才会导致缺少属性错误。