Ruby require 的查询机制以及和 load 的区别.

towonzhou · 2013年07月18日 · 最后由 sevk 回复于 2013年07月18日 · 4113 次阅读

还请大牛们指教........ require 有缓存机制么? require(name) → true or false

require 会加载这个 name,如果加载成功返回 true,若已经被加载则返回 false

下面大略整理出来的 require 查找流程。

require 会判断是否为绝对路径,若是绝对路径查找速率最快。若不是绝对路径,则

  1. 从$:中抽出第一个路径作为查找基准。
  2. 直接从目录中查找 name 文件,如果存在则结束查找,如果不存在,则进行下一条查找。
  3. 尝试添加.rb, .so, .o, .dll 后缀后查找,如果存在文件,则结束查找。如果不存在,则进行下一条。
  4. 如果继续失败则抽出$:里面的下一个目录作为基准查找,循环 2-3 步骤。
  5. 如果失败循环 1-4 步骤,直到$:的最后一个为止。
  6. 如果还是失败,抛出异常。

require 还有个$"路径列表。
$"是一个数组,获得 name 的绝对路径后,require 会判断这个路径是否在$"里,若在,则 require 不再 load 这个文件,若不在会 load 这个文件,并且把绝对路径加到$"里,以便下次 require 判断。

load 没有维护这个$"数组,所以他每次都会重新 load 文件,而且 load 还有一个 wrap 参数,有兴趣的可以研究下。

这是屎吗?

所以加载文件多的情况下 load 性能要更好一些

如果是 OS X,那可能加载 .bundle 文件

加载文件超过 3 万个时,load 性能要更好一些

需要 登录 后方可回复, 如果你还没有账号请 注册新账号