QCon北京「鸿蒙专场」火热来袭!即刻报名,与创新同行~ 了解详情
写点什么

提高 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:563465
用户头像

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

关注

评论

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

ToB企业的财务核算利器——智能收款认领中心!

用友BIP

智能收款

华为云API文字识别OCR的高效性—AI中名副其实的电子眼

平平无奇爱好科技

华为云智能化组装式交付方案 | 金融级PaaS业务洞察及Web3实践的卓越贡献

平平无奇爱好科技

南京水务:通过推进全面预算、财务共享等数智化转型,探寻业财融合

用友BIP

业财融合

九章云极DataCanvas公司入选《AIGC产业链北京专精特新企业图谱》

九章云极DataCanvas

浅谈互联网系统监控体系

老农小江

互联网 微服务 监控

各种业务场景调用API代理的API接口教程

Noah

API

比特币有助减少腐败;微软 Copilot 每月赔 20 美元;AIGC 明年会“洗冷水澡”丨 RTE 开发者日报 Vol.64

声网

如何通过高级流量管理提高 Kubernetes 的弹性

NGINX开源社区

Kubernetes 微服务 nginx 开源版

华为云API对话机器人CBS的魅力—实现简单的对话操作

平平无奇爱好科技

可信AI评估 | 机器学习平台标准解读

中国信通院AI Infra工作组

16个最佳Chrome插件推荐给做前端的你

互联网工科生

前端 Chrome插件

关于征集《人工智能开发平台通用能力要求 第4部分:大模型技术要求》标准参编单位及参与专家的通知

中国信通院AI Infra工作组

华为云API图像识别Image的趣味性—AI识别迈克尔·杰克逊

平平无奇爱好科技

流水线中便捷迭代,鲲鹏DevKit 23.0新能力抢先看

华为云开发者联盟

后端 开发 华为云 鲲鹏 华为云开发者联盟

用友BIP,助力装备制造企业数智化转型

用友BIP

制造 数智化

关于征集人工智能训练芯片标准参编单位的通知

中国信通院AI Infra工作组

Hadoop 集群间同步数据的最佳实践

冰心的小屋

hadoop kerberos hadoop distcp

关于征集金融业人工智能平台标准参编单位的通知

中国信通院AI Infra工作组

华为云API对话机器人的魅力—体验AI垃圾分类机器人

平平无奇爱好科技

全功能笔记工具:Keep It激活最新版

胖墩儿不胖y

Mac软件 笔记工具

客服订单详情页体验升级之路

得物技术

性能优化 前端 客服业务

Intellij IDEA快捷键大全(超详细)

小齐写代码

WiFi 6 IPQ5018 and WiFi 5 IPQ4019/IPQ4029-Discover the difference

wifi6-yiyi

ipq4029 ipq5018 WiFi 5

如何设计一个网络爬虫?

Noah

爬虫 API 编排

华为云API对话机器人CBS的魅力—要是有AI,我要做“李白”- 5分钟开发作诗机器人

平平无奇爱好科技

KubeCon China 2023 | 拥抱开源,华为云原生华彩绽放

华为云开发者联盟

开源 云原生 后端 华为云 华为云开发者联盟

使用 KubeSkoop exporter 监测和定位容器网络抖动问题

阿里巴巴云原生

阿里云 云原生 KubeSkoop

优化模型之“标注错误”

矩视智能

深度学习 机器视觉 缺陷检测

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