跳至内容 跳至搜索

Benchmarkable

方法
B

实例公共方法

benchmark(message = "Benchmarking", options = {}, &block)

允许您在模板中测量代码块的执行时间,并将结果记录到日志中。将此代码块包装在昂贵的操作或潜在的瓶颈周围,以获取操作的计时信息。例如,假设您认为您的文件处理方法花费的时间过长;您可以将其包装在 benchmark 代码块中。

<% benchmark 'Process data files' do %>
  <%= expensive_files_operation %>
<% end %>

这将在日志中添加类似“Process data files (345.2ms)”的内容,您可以使用它在优化代码时比较计时信息。

您可以选择性地提供一个日志级别(:debug:info:warn:error)作为 :level 选项。默认的日志级别值为 :info

<% benchmark 'Low-level files', level: :debug do %>
  <%= lowlevel_files_operation %>
<% end %>

最后,您可以将 true 作为第三个参数传递,以静默代码块内部的所有日志活动(除了计时信息)。这非常适合将一个嘈杂的代码块简化为仅产生一行日志的单个语句。

<% benchmark 'Process data files', level: :info, silence: true do %>
  <%= expensive_and_chatty_files_operation %>
<% end %>
# File activesupport/lib/active_support/benchmarkable.rb, line 38
def benchmark(message = "Benchmarking", options = {}, &block)
  if logger
    options.assert_valid_keys(:level, :silence)
    options[:level] ||= :info

    result = nil
    ms = Benchmark.ms { result = options[:silence] ? logger.silence(&block) : yield }
    logger.public_send(options[:level], "%s (%.1fms)" % [ message, ms ])
    result
  else
    yield
  end
end