【问题标题】:Accurately Timing RSpec Specs准确计时 RSpec 规范
【发布时间】:2020-07-22 12:19:09
【问题描述】:

我有 2 个测试。一个使用数据库调用,一个使用双精度。我想了解它们之间的性能差异。我意识到这可能很小,但我只是想在选择使用存根或实际调用数据库时更好地了解权衡的延迟方面。

我最初认为这就像运行类似的东西一样简单

time rspec spec_with_db_spec.rb

time rspec spec_with_double_spec.rb

独立地并且可能以随机顺序一遍又一遍地重复,所以我可以取平均值,但是,我遇到了一些问题。

  1. 似乎time 可能不是最好的方法,因为它可能恰好与我的计算机上同时发生的特别昂贵的进程相吻合。我想一遍又一遍地运行它可以帮助解决这个问题,但我不确定。
  2. 我意识到我也许可以使用 RSpec 的时间输出,但根据(尽管是旧的)帖子,这似乎不可靠。

有人对此有想法吗?它不需要是完美的,而只是我可以运行并看到差异以及差异大约有多少(数量级很好)。

【问题讨论】:

  • 也许你可以在规范中使用 Rubys Benchmark module。但是,如果差异可以忽略不计,那么测试的敏锐度确实应该是一个更大的问题。模拟倾向于掩盖您的测试应该防止的错误和不一致。
  • 完全同意这不应该是选择 db call 或 double 时的主要驱动因素,但我仍然很好奇。
  • 这是我个人学习用的,顺便说一下。
  • 过去我在运行 RSpec 时遇到了一个缓慢的测试套件,只是使用了 --profile 选项。它向您展示了最慢的规格是什么。它不会真正做与基准测试相同的事情,但它确实可以帮助您找到问题区域。
  • 完全。对于现有代码库来说,这将是一个很好的方法。

标签: ruby-on-rails performance time rspec


【解决方案1】:

你可以使用Benchmark tool中内置的Rubys:

require 'rails_helper'
require 'benchmark' # from the stdlib

RSpec.describe 'Benchmark' do
  let(:create_bm) do
    Benchmark.bm { FactoryBot.create_list(:user, 100) } 
  end

  let(:build_bm) do
    Benchmark.bm { FactoryBot.build_list(:user, 100) } 
  end

  it 'can give you the total time' do
    pending "Creating the list took #{create_bm.total} seconds"
  end

  specify 'you do not need two separate spec files' do
    pending "Building the list took #{build_bm.total} seconds"
  end

  specify 'stubbing is faster' do
    expect(build_bm.total).to be < create_bm.total
  end
end

【讨论】:

    【解决方案2】:

    在 rspec 测试中使用 time 不会产生准确的结果。时间将包括测试必须做的所有其他事情:加载 Ruby、加载 gems 和 rspec 框架。这可能会占用您尝试进行基准测试的代码所花费的时间。

    您只需要运行一次测试,必须多次运行才能获得准确的结果。通过在不同时间在不同进程中运行不同的测试可能意味着它们在机器上会受到不同环境的影响。例如,如果在您的防病毒软件开始运行的同时运行一个怎么办?

    改为使用built in Benchmark module。这些只会计算基准代码所花费的时间。

    【讨论】:

    • 您是否有文档详细说明“随机交错基准测试,以便计算机上可能影响基准测试的任何事件都会影响它们”?我在基准文档中没有看到它
    • @stk1234 你是对的,它没有。所有的循环都取决于你。我认为它做了这些事情,因为这就是一个好的基准模块应该表现的方式。
    • 好的,不用担心!只是想确保我没有错过您阅读它的另一个来源。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 2015-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多