class CodeTools::Profiler
Constants
- Error
Attributes
mode[R]
path[R]
Public Class Methods
new(path, mode = nil)
click to toggle source
# File tools/profile, line 17 def initialize(path, mode = nil) assert_ruby_file_exists(path) @path, @mode = path, mode require "benchmark" end
Public Instance Methods
profile_requires()
click to toggle source
# File tools/profile, line 23 def profile_requires GC.start before_rss = `ps -o rss= -p #{Process.pid}`.to_i if mode require "ruby-prof" RubyProf.measure_mode = RubyProf.const_get(mode.upcase) RubyProf.start else Object.instance_eval { include RequireProfiler } end elapsed = Benchmark.realtime { require path } results = RubyProf.stop if mode GC.start after_rss = `ps -o rss= -p #{Process.pid}`.to_i if mode if printer = ARGV.shift puts "RubyProf outputting to stderr with printer #{printer}" RubyProf.const_get("#{printer.to_s.classify}Printer").new(results).print($stdout) elsif RubyProf.const_defined?(:CallStackPrinter) filename = "#{File.basename(path, '.rb')}.#{mode}.html" puts "RubyProf outputting to #{filename}" File.open(filename, "w") do |out| RubyProf::CallStackPrinter.new(results).print(out) end else filename = "#{File.basename(path, '.rb')}.#{mode}.callgrind" puts "RubyProf outputting to #{filename}" File.open(filename, "w") do |out| RubyProf::CallTreePrinter.new(results).print(out) end end end RequireProfiler.stats.each do |file, depth, sec| if sec puts "%8.1f ms %s%s" % [sec * 1000, " " * depth, file] else puts "#{' ' * (13 + depth)}#{file}" end end puts "%8.1f ms %d KB RSS" % [elapsed * 1000, after_rss - before_rss] end
Private Instance Methods
assert_ruby_file_exists(path)
click to toggle source
# File tools/profile, line 72 def assert_ruby_file_exists(path) fail Error.new("No such file") unless File.exist?(path) fail Error.new("#{path} is a directory") if File.directory?(path) ruby_extension = File.extname(path) == ".rb" ruby_executable = File.open(path, "rb") { |f| f.readline } =~ [/\A#!.*ruby/] fail Error.new("Not a ruby file") unless ruby_extension || ruby_executable end