【问题标题】:Why is rspec so slow under rake? ruby_noexec_wrapper?为什么 rspec 在 rake 下这么慢? ruby_noexec_wrapper?
【发布时间】:2013-03-22 12:58:03
【问题描述】:

我的规范代码运行时间比预期的要长,但当我尝试在rspec-prof 下运行它们时,问题似乎消失了。最终,我发现了在本地运行 rake 与在解释器下运行它的区别。

仅运行 rake 需要 75 秒,但运行 ruby $(which rake) 只需 12 秒。这比 5 倍 快多了。看看:

$ rake
~/.rvm/rubies/ruby-1.9.2-p320/bin/ruby -w -S rspec spec/args_spec.rb spec/levels_spec.rb spec/opts_spec.rb spec/run_spec.rb spec/split_spec.rb spec/unit_spec.rb
~/.rvm/gems/ruby-1.9.2-p320/gems/bundler-1.2.3/lib/bundler/source.rb:516: warning: method redefined; discarding old revision
..................................................

Finished in 1 minute 14.39 seconds
50 examples, 0 failures

$ ruby `which rake`
~/.rvm/rubies/ruby-1.9.2-p320/bin/ruby -w -S rspec spec/args_spec.rb spec/levels_spec.rb spec/opts_spec.rb spec/run_spec.rb spec/split_spec.rb spec/unit_spec.rb
..................................................

Finished in 12.88 seconds
50 examples, 0 failures

查看rake“包装二进制”的内容显示在“#!”中它在解释器下运行的行 - ruby_noexec_wrapper - 并且确实将命令运行为:

ruby_noexec_wrapper $(which rake)

同样慢速运行 75 秒。

任何想法为什么会这样?

除了避免直接运行 rake 之外,还有什么可以改进的吗?既然这是将 gem 包装成二进制文件的标准方法,那难道不会降低所有 gem 打包工具的速度吗?

【问题讨论】:

    标签: ruby rspec rake


    【解决方案1】:

    我们来看看ruby_noexec_wrapper文件(rvm 1.16.17):

    #!/usr/bin/env ruby
    
    original_file=ARGV[0]
    ARGV.shift
    $PROGRAM_NAME=original_file
    
    require 'rubygems'
    begin
      require 'rubygems-bundler/noexec'
    rescue LoadError
      warn "unable to load rubygems-bundler/noexec" if ENV.key?('NOEXEC_DEBUG')
    end
    
    eval File.read(original_file), binding, original_file
    

    据我所知,两个警告区域是两个require 语句。第一个 require 'rubygems' 不太可能成为问题,因为 ruby​​ 1.9+ does this automatically

    我认为问题出在require 'rubygems-bundler/noexec'。如果您 take a look at what it's doing 您可以看到它正在设置捆绑程序。这涉及到需要 gem,这可能是您启动缓慢的原因。

    Gems 在加载时不应该做很多事情,但不幸的是,它们中的许多人在这方面会犯一些错误。解决此问题的唯一方法是尝试找出导致大部分缓慢的宝石,并在可能的情况下找到替代方案。

    【讨论】:

      猜你喜欢
      • 2020-11-14
      • 1970-01-01
      • 2021-09-03
      • 1970-01-01
      • 1970-01-01
      • 2016-09-28
      • 2020-02-08
      • 2012-07-17
      • 2011-11-07
      相关资源
      最近更新 更多