宝石数量对Rails应用程序性能的影响程度如何?

时间:2012-10-19 17:12:30

标签: ruby-on-rails ruby performance rubygems

我是Rails的新手,这可能是一个愚蠢的问题,但我想知道宝石的数量如何影响Rails应用程序的性能?你添加的宝石越多,它变慢吗?每个请求都会调用所有宝石吗?

我问这个问题是因为,例如,在Django中,你在每个调用它的.py文件中导入所有需要的类/方法/库。在Rails你没有这样做,一切都是“自动加载”,但我想知道,这种“自动加载”的成本是多少?

是否意味着每次请求都会调用所有宝石?

2 个答案:

答案 0 :(得分:11)

自动加载只是一种替换“导入所有需要的类/方法/库”的方法,“如果你把文件放在特定的地方,我们就可以找到它们。”

基本算法类似于“如果您使用类或模块但未找到它,在我们告诉您无法找到它之前,请在其中一条路径中搜索它。”

自动加载与寻找宝石是正交的,而是找到应用程序的代码。换句话说,在应用启动时,您的Gem文件已经加载并需要一次,但自动加载机制不是在宝石上运行,而是在应用程序的代码上运行。

所以回答问题的第一部分:gem加载与自动加载没有直接关系。将新宝石包含到您的应用中可能会使应用启动速度变慢,因为找到并解析了库,但它们在启动后会一直加载;它不会影响您的每次请求性能。

很高兴知道RubyGems是 Ruby 的一部分,而自动加载是 Rails 的一部分:Rails是一个在Ruby之上编写的框架,同样的方式Django是一个基于Python编写的框架,但Ruby和Rails非常独特。 Gems是Ruby的一部分,自动加载是Rails的一部分。

自动加载旨在加快开发速度;每次进行更改时都不必重新启动服务器,如果按照目录布局约定,每次请求都会重新加载文件(以及应用程序中的文件) 。这很好,因为您可以在开发时让服务器保持运行。

值得注意的是,仅在开发模式下。在生产模式下,如果文件只缺少一次并且在请求中记住它,它将找到该文件,以便为每个请求节省文件系统搜索的开销。事实上,如果你使用的是Rails 3.2或更高版本,它甚至在开发模式下也会变得足够聪明,只有在自上次请求后更改文件时才重新加载文件,从而在开发过程中使事情变得更快。

你没有 使用自动加载,顺便说一句:你可以手动require你需要的文件,就像你在Python上谈到的那样。这是标准的Ruby做事方式。这将完全绕过该文件的自动加载,因为你的常量永远不会“找不到”:这很好,因为它会提高你的应用程序的性能,但是很糟糕,因为你每次更改代码时都必须重新启动你的应用程序。 / p>

tl; dr:不用担心自动加载性能。它将以开发模式为代价,以开发速度为代价,在开发模式中为您提供帮助。

答案 1 :(得分:1)

宝石 WILL 的数量会以下列方式影响您的Rails应用的效果:

  • 启动应用程序/加载环境时,必须加载所有宝石。这个装载 如果有更多的宝石,显然需要更长的时间。你会在开发过程中特别注意到这一点,因为你将很多时候加载你的环境(希望如此)(例如每次进行单元测试时)。
  • 更多(加载)代码也需要更多空间,因此如果您使用更多宝石,您的应用将消耗更多内存。

这两点都相当微妙,你不会注意到加载5或10颗宝石之间的区别。但是一旦你达到20或50颗宝石的数字,你就会开始注意到......