当我提出这个问题时,我正在考虑ruby,但如果答案与语言无关,我也想知道。
我常常来自红宝石标准库require
,即fileutils
,open3
和pathname
。
但是,如果我只需要在一两行中使用它们的功能,我就会避免使用它们,并选择不需要require
的(有时不太可读)替代方案。
但是,使用它们似乎不会损害我的脚本的性能,即使使用快速基准测试(使用time
),事情似乎也会以与使用不同方法时相同的速度运行。但这对我来说似乎很奇怪它没有任何区别,因为为什么然后让它们成为使用require
d(而不仅仅是包括在内)?那么,具体问题:
导入库将花费非零时间,但是时间量与库的大小成正比。有些非常小,有些要大得多,但所有随Ruby一起提供的产品通常都可以快速加载。
除非你每秒运行你的脚本一千次,否则require
的影响将是最小的。
通常最好尽快将所有require
操作排除在外,以消除任何依赖性问题,尤其是使用宝石。没有什么比因为依赖性破坏而导致崩溃的代码更糟糕,但只有在执行不经常发生的特定操作时才会发生。
如果您开始这个过程数千次,请考虑像Spring这样的工具或您自己的分叉模型,以避免启动惩罚。您可以多次对fork
进行预先配置的过程,每个过程几乎可以立即就绪。
使用require
时,您告诉Ruby加载一些文件(您自己的文件,标准库或外部库)。
所以是的,找到并加载它需要时间。
但是所需的文件正在加载only once(通常在开始时因为文件顶部通常是require
)。
加载给定的
name
,如果成功则返回true
,如果已加载该功能则返回false
。加载文件的绝对路径将添加到
$LOADED_FEATURES
($"
)。如果文件的路径已经出现在$"
中,则不会再次加载该文件
花费的时间取决于文件大小和相关文件的大小。