为啥 Kernel#require 占用了我的应用程序资源的这么大块?

Posted

技术标签:

【中文标题】为啥 Kernel#require 占用了我的应用程序资源的这么大块?【英文标题】:Why is Kernel#require taking such a big chunk of my application's resources?为什么 Kernel#require 占用了我的应用程序资源的这么大块? 【发布时间】:2011-06-13 21:35:20 【问题描述】:

我正在尝试 ruby​​-prof 并针对一个有点独立的模块运行它。该模块的核心是 3 个类,可能还使用了 3 个其他辅助类。所以不应该有大量的需求和包含的大量开销。这在安装了大量 gem 的大型(gish)应用程序中是否正常?

 18.06      7.67     1.99     0.00     7.66     1366  Kernel#require
  5.80      1.21     0.64     0.00     0.83    18704  Array#map
  5.73     10.21     0.63     0.00    10.09    38133  Array#each
  5.17      1.13     0.57     0.00     0.56    21796  Array#include?
  4.40      0.49     0.49     0.00     0.00   345434  Symbol#to_s
  3.78      0.42     0.42     0.00     0.00   446478  String#==

【问题讨论】:

相当数量的宝石?你能详细说明吗?似乎这可能会考虑到所需的时间。 【参考方案1】:

来自ruby-prof的documentation:

要分析一个 Rails 应用程序,它是 使用生产运行它至关重要 设置(缓存类,缓存视图 查找等)。否则,Rail 的 依赖加载代码将不堪重负 在应用程序中花费的任何时间 本身(我们的测试表明 Rails 依赖加载导致大约 6 倍 减速)。

您是否使用生产设置运行此程序?如果您没有使用缓存数据,而是每次都必须从磁盘读取文件/类,我可以理解您为什么会看到您的系统在Kernel#require 上花费这么多时间。

【讨论】:

【参考方案2】:

根据您的描述,我在类似的情况下运行了 ruby​​-prof,除了我的只需要两颗宝石,我认为这不符合“公平数字”的条件。话虽如此,我仍然将 7 秒运行时间的 10% 用于 Kernel#gem_original_require 类。

我想你所看到的很典型,因为它似乎与我的情况相当。

【讨论】:

以上是关于为啥 Kernel#require 占用了我的应用程序资源的这么大块?的主要内容,如果未能解决你的问题,请参考以下文章

为啥当我使用“require”时我的变量未定义? [复制]

如何找到哪个应用程序占用了我的端口? [关闭]

为啥我的 UIImage 占用这么多内存?

Linux中是谁占用了我的端口

为啥 require('fs') 导致我的 js 变量不在 html 中显示?

为啥我的 sqlite 数据库中的 rawquery 给了我错误的人?