环境:
如题,对自己的创建的 gem,写 spec 测试:需要每一个方法调用的实际执行时间,并保存!
除了对每一个方法添加 benchmark 块之外,有没有其他简单的方法或者可以优化改进的地方?
自己手动实现一下
Rspec.configure do |config|
config.before(:each) do
@start_timer = Time.now
end
config.after(:each) {}
puts "Spec ran in #{Time.now - @start_timer}s"
end
end
it "do something" do
method_a
method_b
end
你是说想要知道method_a
和method_b
方法的执行时间吗?
RSpec.configure do |config|
config.example_status_persistence_file_path = "spec.txt"
end
用 RSpec 3.3 跑一遍自己看看文件内容。
一个简单的实现方式:
require 'ruby-prof'
RSpec.configure do |config|
config.around do |example|
RubyProf.start
example.run
result = RubyProf.stop
result.eliminate_methods!([/RSpec::.*/])
printer = RubyProf::FlatPrinter.new(result)
printer.print(STDOUT)
end
end
输出:
Measure Mode: wall_time
Thread ID: 4264760
Fiber ID: 25310560
Total: 1.000637
Sort by: self_time
%self total self wait child calls name
99.95 1.000 1.000 0.000 0.000 1 Kernel#sleep
0.03 1.001 0.000 0.000 1.000 1 Proc#call
0.01 0.000 0.000 0.000 0.000 7 *Array#each
0.00 1.001 0.000 0.000 1.001 1 Global#[No method]
0.00 0.000 0.000 0.000 0.000 2 Kernel#singleton_class
0.00 0.000 0.000 0.000 0.000 2 Hash#fetch
0.00 0.000 0.000 0.000 0.000 1 Proc#yield
0.00 0.000 0.000 0.000 0.000 4 *Class#new
0.00 1.000 0.000 0.000 1.000 1 Object#method_a
0.00 0.000 0.000 0.000 0.000 12 Symbol#==
0.00 0.000 0.000 0.000 0.000 1 Array#reverse_each
0.00 0.000 0.000 0.000 0.000 1 Hash#clear
0.00 0.000 0.000 0.000 0.000 3 Hash#each_value
0.00 1.000 0.000 0.000 1.000 1 BasicObject#instance_exec
0.00 0.000 0.000 0.000 0.000 1 Array#reverse
0.00 0.000 0.000 0.000 0.000 2 <Module::RSpec>#configuration
0.00 0.000 0.000 0.000 0.000 1 Array#pop
0.00 0.000 0.000 0.000 0.000 1 Hash#values
0.00 0.000 0.000 0.000 0.000 1 Array#last
0.00 0.000 0.000 0.000 0.000 1 NilClass#nil?
0.00 0.000 0.000 0.000 0.000 2 Mutex#initialize
* indicates recursively called methods
method_a
的执行时间为1s
0.00 1.000 0.000 0.000 1.000 1 Object#method_a
这个还是不好,输出了很多无关的东西,其实已经把 RSpec 的方法调用过滤掉了,否则更多。