跳至内容 跳至搜索

Benchmarkable

方法
B

实例公有方法

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

允许您在模板中测量代码块的执行时间,并将结果记录到日志中。将此代码块包裹在昂贵的操作或可能的瓶颈周围,以便获得操作的时间读数。例如,假设您认为您的文件处理方法花费的时间过长;您可以将其包裹在一个基准代码块中。

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

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

您可以作为 :level 选项提供一个可选的记录器级别(:debug:info:warn:error)。默认记录器级别值为 :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 37
def benchmark(message = "Benchmarking", options = {}, &block)
  if logger
    options.assert_valid_keys(:level, :silence)
    options[:level] ||= :info

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