写点什么

提高 Ruby on Rails 性能的几种技巧

  • 2010-08-18
  • 本文字数:1332 字

    阅读完需:约 4 分钟

Ruby on Rails 以其高度的易用性和灵活性著称,不过这些优点的背后还存在着性能的隐患。最近,资深 Ruby on Rails 作家 David Berube 提供了几个 Ruby on Rails 性能优化的技巧,对相关开发人员具有一定的借鉴意义。

David Berube 在文章中首先分析了 Rails 应用运行缓慢的原因:

  • Rails 总是会做一些假设为您加速开发。通常,这种假设是正确而有帮助的。不过,它们并不总能有益于性能,并且还会导致资源使用的效率低下——尤其是数据库资源。
  • 另一个显著的挑战是 N+1 问题…这会导致很多小查询的执行,而不是一个单一的大查询。例如,ActiveRecord 无从知道一组父记录中的哪一个会请求一个子记录,所以它会为每个父记录生成一个子记录查询。由于每查询的负荷,这种行为将导致明显的性能问题。
  • 由于 ActiveRecord 能够让如此众多的任务变得轻而易举,Rails 开发人员常常会形成 “SQL 不怎样” 的一种态度,即便在更适合使用 SQL 的时候,也会避免 SQL。创建和处理数量巨大的 ActiveRecord 对象的速度会非常缓慢,所以在有些情况下,直接编写一个无需实例化任何对象的 SQL 查询会更快些。

对于如何检测性能问题, David Berube 提供了一些建议:

  • 最好的工具之一是 Rails 开发日志,它通常位于每个开发机器上的 log/development.log 文件内。它具有各种综合指标:响应请求所花费的总时间、花费在数据库内的时间所占的百分比、生成视图所花时间的百分比等。
  • 在生产期间,通过查看 mysql_slow_log 可以找到很多有价值的信息。
  • 其中一个最强大也是最为有用的工具是 query_reviewer 插件。这个插件可显示在页面上有多少查询在执行以及页面生成需要多长时间。并且它还会自动分析 ActiveRecord 生成的 SQL 代码以便发现潜在问题。例如,它能找到不使用 MySQL 索引的查询,所以如果您忘记了索引一个重要的列并由此造成了性能问题,那么您将能很容易地找到这个列。此插件在一个弹出的
    (只在开发模式下可见)中显示了所有这类信息。

针对 N+1 查询问题,David Berube 举了一个未优化的代码示例:

<%@posts = Post.all(@posts).each do |p|%>

<%=p.category.name%>

<%=p.body%>

<%end%>

David Berube 指出,上述代码生成了一个查询外加 @posts 内的每行一个查询。由于每查询的负荷,这可能会成为一个很大的挑战。罪魁祸首是对 p.category.name 的调用。这个调用只应用于该特定的 post 对象,而不是整个 @posts 数组。这种情况通过使用立即加载可以修复。立即加载(Eager loading)意味着 Rails 将自动执行所需的查询来加载任何特定子对象的对象。Rails 将使用一个 JOIN SQL 语句或一个执行多个查询的策略。不过,假设指定了将要使用的所有子对象,那么将永远不会导致 N+1 的情形,在 N+1 情形下,一个循环的每个迭代都会生成额外的一个查询。优化后的代码如下:

<%@posts = Post.find(:all, :include=>[:category] @posts.each do |p|%>

<%=p.category.name%>

<%=p.body%>

<%end%>

比较复杂的情况包括嵌套的立即加载间接的立即加载

除了解决 N+1 问题之外,David Berube 还提供了其他一些优化建议:

InfoQ 将继续关注 Ruby on Rails 的发展,读者朋友可以通过 InfoQ 中文站 Ruby 社区了解更多信息。

2010-08-18 23:563422
用户头像

发布了 501 篇内容, 共 262.0 次阅读, 收获喜欢 61 次。

关注

评论

发布
暂无评论
发现更多内容

cad2024 mac版更新 最新AutoCAD 2024中文破解版下载

iMac小白

如何在淘宝的item_search_seller API中获取店铺列表?

技术冰糖葫芦

API 文档

如何获取item_search_guang API中与“爱逛街”相关的API接口?

技术冰糖葫芦

API 文档

idea如何新建一个多模块的springCloud项目

javaNice

Java SpringCloud

MySQL大表设计

EquatorCoco

MySQL 数据库 数据库云

专访|OpenTiny 开源社区 常浩:完成比完美更重要

OpenTiny社区

开源 Vue 前端 富文本编辑器

企业如何选择一款高效的ETL工具

RestCloud

ETL

低代码:数字化转型趋势下的快速开发方式

互联网工科生

低代码 数字化

软件测试/测试开发丨人工智能时代软件测试的变化

测试人

人工智能 软件测试

低代码PaaS开发平台

树上有只程序猿

低代码 PaaS 私有化部署

2023 IoTDB Summit 应用实例议题详解 | 报名到场即送卫衣!

Apache IoTDB

跨境选品工具推荐|这些选品神器,跨境卖家都在用!

Geek_ccdd7f

小程序开发“巨坑”多,华为云这款轻量应用服务器轻松避坑

YG科技

pdf增强插件Enfocus PitStop Pro 2020 for Mac下载

iMac小白

OmniGraffle Pro for mac(思维导图软件)v7.22.4激活版

mac

苹果mac Windows软件 OmniGraffle Pro 图形设计工具

C++ LibCurl实现Web指纹识别

不在线第一只蜗牛

c++ 编程 web socket LibC

智能监控,高效观测 IT 系统瓶颈

观测云

IT 智能监控

干货丨小程序开发秘籍,华为云这款服务器才是真香系列

YG科技

多个云平台,撑着零售消费企业们向上爬坡中

ToB行业头条

JD-GUI 反编译jar包

javaNice

Java

HashMap HashTable ConcurrentMap 中key value是否可以为null

javaNice

Java

为中小企业发展按下“提速键”,华为云这款轻量应用服务器成双11爆款

YG科技

剧情继续:马斯克曝出OpenAI前员工举报信,董事会与奥特曼谈判回归

Openlab_cosmoplat

埃森哲使用 Amazon CodeWhisperer 助力开发人员提高工作效率

亚马逊云科技 (Amazon Web Services)

Java Python 人工智能 S3 Amazon CodeWhisperer

人工成本高企?华为云耀云服务器L实例打通企业网站开发最后堵着

YG科技

PDF Expert for mac(pdf编辑工具) v3.7.1永久激活版

mac

PDF Expert 苹果mac Windows软件 PDF编辑和阅读工具

阿里云崩溃损失大?华为云耀云服务器L实例为企业保驾护航

YG科技

CleanMyMac X for mac下载 优化清理软件

iMac小白

IT打工人避雷针!华为云这款轻量应用服务器是网站开发“神器”

YG科技

火山引擎ByteHouse:如何优化ClickHouse物化视图能力?

字节跳动数据平台

数据库 大数据 云原生

Nginx配置Websocket

EquatorCoco

HTTP websocket 协议解析

提高Ruby on Rails性能的几种技巧_Ruby_崔康_InfoQ精选文章