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

Tim*_*s83 4 ruby performance rubygems ruby-on-rails

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

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

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

Mat*_*att 11

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

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

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

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

很高兴知道RubyGems是Ruby的一部分,自动加载是Rails的一部分:Rails是一个基于Ruby编写的框架,就像Django是一个基于Python编写的框架一样,但Ruby和Rails是非常独特的.Gems是Ruby的一部分,自动加载是Rails的一部分.

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

值得注意的是,仅在开发模式中才是这样.在生产模式下,如果文件只缺少一次并且在请求中记住它,它将找到该文件,以便节省您在每个请求上搜索文件系统的开销.事实上,如果你使用的是Rails 3.2或更高版本,即使在开发模式下它也会变得足够智能,只有在自上次请求后才更改文件,在开发过程中使事情变得更快.

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

tl; dr:不用担心自动加载性能.它将以开发模式为代价,以应用程序性能为代价,并以开发速度为代价在生产模式中保持高效.