为啥 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 占用了我的应用程序资源的这么大块?的主要内容,如果未能解决你的问题,请参考以下文章