如何提高 Ruby On Rails 性能

Python09

如何提高 Ruby On Rails 性能,第1张

有三种方法可以让你的应用更快:扩容、缓存和代码优化。

扩容在如今很容易实现。Heroku 基本上就是为你做这个的,而 Hirefire 则让这一过程更加的自动化。你可以在这个了解到更多有关自动扩容的内容。其它的托管环境提供了类似的解决方案。总之,可以的话你用它就是了。但是请牢记扩容并不是一颗改善性能的银弹。如果你的应用只需在 5 分钟内响应一个请求,扩容就没有什么用。还有就是用 Heroku + Hirefire 几乎很容易导致你的银行账户透支。我已经见识过 Hirefire 把我一个应用的扩容至 36 个实体,让我为此支付了 $3100。我立马就手动吧实例减容到了 2 个, 并且对代码进行了优化.

Rails 缓存也很容易实施。Rails 4 中的块缓存非常不错。Rails 文档 是有关缓存知识的优秀资料。另外还有一篇 Cheyne Wallace 有关 Rails 性能的文章 也值得一读。如今设置 Memcached 也简单。不过同扩容相比,缓存并不能成为性能问题的终极解决方案。如果你的代码无法理想的运行,那么你将发现自己会把越来越多的资源耗费在缓存上,直到缓存再也不能带来速度的提升。

让你的 Rails 应用更快的唯一可靠的方式就是代码优化。在 Rails 的场景中这就是内存优化。而理所当然的是,如果你接受了我的建议,并且避免把 Rails 用于它的设计能力范围之外,你就会有更少的代码要优化。

ROR开发效率高与二者都有关系的,不过如果说哪个占的更多一些,应该是Rails框架了,原因如下:

ruby就其语法而言,语法灵活,提供的类库和方法也非常丰富,所以与其它语言相比,同样的功能,ruby的代码量更少。这也是网上经常出现如“ruby如何一条语句实现此功能”等问题,这是其它语言无法比的

rails之所以在效率高中贡献大,是因为其约定大于配置和各种自动生成器及自定义模板:

约定大于配置,就可以使开发者更专注于开发,所以rails中基本没有配置,即使有也非常少,相比j2ee就是0和100的关系,这无形中节省了开发者的时间

各种生成器,比如scaffold,实现一个CURD只需要1分钟,对于熟练的开发者10秒搞定,所以这个速度是其它框架无法比的。

所以,Ruby On Rails的开发效率就不用说了,是java和j2ee望尘莫及的。

之前大家都在说ROR的开发效率高,更多的是与java的j2ee比较,而各语言发展到现在,已经借鉴了Ruby和Rails很多特性了,所以,如果你熟悉一门语言,只要使用与Rails思想相近的框架就可以了,但是像静态语言还是没有办法的。

细说Ruby工程的Bundle以及如何加快bundle install

做过Ruby项目的人可能有过我一样的感受,rubygems.org在中国的访问太慢了,每次我们bundle install都要等老长时间,而我们通过浏览器去下载对应的gems文件时却速度刷刷的。。。 为什么会出现这样的情况呢? 明明我们在Gemfile中写的是:

source ""

好了,既然bundle install很慢,那我就去下载gem文件下来到本地,然后运行:

gem install /path/to/gems/***.gem

结果发现,有些gem文件安装速度很快,有些bundle安装很慢。 为啥呢? 我们又如何去避免这样的痛苦呢?

好,那下面我就先来详细说明一下ruby的bundle机制。

首先说一下Gemfile文件,Gemfile就是用来描述你当前ruby工程需要依赖的插件bundle,好比在java的插件工程,当前工程会依赖哪些其他插件,依赖的插件有版本区别。比如下面就是我的一个简单ruby工程的Gemfile文件内容:

source ""

gem "rspec", "~>2.7.0"

gem "rake", "~>0.9.2.2"

第一行说明我bundle下载的服务器

第3行和第4行说明我当前工程需要依赖rspec插件和rake插件

"~>2.7.0"表示需要对于的版本好为 >= 2.7.0 而且 <= 2.8.0

在运行调用代码之前都需要先bundle install好对于的插件bundle

但是写了Gemfile就需要安装bundler插件,这个完全可以通过下面的命令来完成

gem install /path/to/gem/bundler-version.gem

(先下载bundler gem文件到local)

好了,安装好了bundler,就可以执行bundle install了。

但是每次都执行bundle install都很慢很慢,让我无法承受。怎么办?

下载到本地然后gem install,发现如果插件有依赖的话,还是同样很慢,因为它会自动访问服务器去下载需要依赖的插件。既然我本地可以通过浏览器直接下载下来我需要的bundle,能否直接利用到本地的? 答案是可以的。

我们完全可以搭建一个本地的gem mirror服务器,而且非常简单。

首先,下载好所有的gem文件(其实就是bundle文件),注意依赖插件也必须准备好,放在本地某个目录中。 然后在这个目录中执行下面命令:

gem generate_index -d /path/to/your/gemfiles/

cd /path/to/your/gemfiles/

gem server

然后修改你的Gemfile的source,改成如下:

source ""

然后运行bundle install,看到的结果一定是让你激动的效果~

最后,建议每个ruby工程目录中增加一个.rvmrc文件,这个文件就是用来指定你该工程使用的ruby版本,已经bundle安装目录和cache目录。.rvmrc的内容只有一句话:

rvm --create use ruby-1.9.2@myprojectname

然后你每次进到工程目录种后都会看到自动切换到相应版本的ruby提示信息。

注意,第一次设置后,需要重新安装bundler以及bundle install,原因可以自己想一下。

另外,每次修改Gemfile时,都需要bundle install一下,这个时候不会安装所有的bundle,因为上次bundle install的时候会生成一个Gemfile.lock文件,告诉bundler哪些bundle已经安装了,而且依赖关系也知道了。 这次只会安装新增的bundle

链接:

1. Creating a RubyGems Mirror With HTTP Basic Authentication

2. Creating your own RubyGem mirror

3. Bundler说明