Bullet:提升 Rails 性能的子弹

  • 丁雪丰

2009 年 11 月 12 日

话题:RubyRuby on Rails语言 & 开发架构

在前段时间结束的Kungfu Rails 大会上,黄志敏先生(Richard Huang)带来了一个关于如何通过插件、Gem 的方式为 Rails 项目做贡献的主题。Richard 开发了很多实用性很强的插件和 Gem,Bullet就是其中之一。

设计 Bullet 插件 /Gem 的目的是通过减少查询的数量帮助开发者提升应用程序的性能。它会在你开发时监视应用程序的查询,并在应该添加 Eager Loading(N+1 查询)时给出提示;在无需使用 Eager Loading 或应该使用计数器缓存时,它同样会给出提示。

Bullet 并不直接提升性能,它只是给出一些提示,指出哪些地方可以得到改善,随后由开发者自行添加:include或者:counter_cache

Bullet 的使用非常方便,以插件或 Gem 方式安装后,经过简单配置即可直接使用(新版本增加了 Growl 支持,对于非 MacOS 用户,可以关闭该功能)。

config.after_initialize do
  Bullet.enable = true
  Bullet.alert = true
  Bullet.bullet_logger = true  
  Bullet.console = true
  Bullet.growl = true
  Bullet.rails_logger = true
  Bullet.disable_browser_cache = true
end

在开发环境下启动服务器,访问页面时,Bullet 会弹出提示,告知可以改进的地方,同时在 Bullet 的日志中也会有相应记录。例如,项目提供的范例中就指出存在 Post 对 Comment 关系的 N+1 查询,开发者可以很快做出修改:

The request has unused preload associations as follows:
None
The request has N+1 queries as follows:
model: Post => associations: [comment]

Bullet 最近正受到越来越多的关注,最新一期的Scaling Rails – On The Edge – Part 1中第一个就介绍了 Bullet,Ruby5RailsInSide也有相关报道,俨然是一枚提升性能的子弹。期待有更多国内开发者能积极贡献自己的力量,为开源社区添砖加瓦。

RubyRuby on Rails语言 & 开发架构