diff options
Diffstat (limited to 'tools')
-rwxr-xr-x | tools/console | 7 | ||||
-rwxr-xr-x | tools/profile | 71 |
2 files changed, 78 insertions, 0 deletions
diff --git a/tools/console b/tools/console new file mode 100755 index 0000000000..ea995a1a54 --- /dev/null +++ b/tools/console @@ -0,0 +1,7 @@ +#!/usr/bin/env ruby +require File.expand_path('../../load_paths', __FILE__) +require 'rails/all' +require 'active_support/all' +require 'irb' +require 'irb/completion' +IRB.start diff --git a/tools/profile b/tools/profile new file mode 100755 index 0000000000..fbea67492b --- /dev/null +++ b/tools/profile @@ -0,0 +1,71 @@ +#!/usr/bin/env ruby +# Example: +# tools/profile activesupport/lib/active_support.rb +ENV['NO_RELOAD'] ||= '1' +ENV['RAILS_ENV'] ||= 'development' + +require 'benchmark' + +module RequireProfiler + private + def require(file, *args) RequireProfiler.profile(file) { super } end + def load(file, *args) RequireProfiler.profile(file) { super } end + + @depth, @stats = 0, [] + class << self + attr_accessor :depth + attr_accessor :stats + + def profile(file) + stats << [file, depth] + self.depth += 1 + result = nil + elapsed = Benchmark.realtime { result = yield } + self.depth -= 1 + stats.pop if stats.last.first == file + stats << [file, depth, elapsed] if result + result + end + end +end + +GC.start +before_rss = `ps -o rss= -p #{Process.pid}`.to_i + +path = ARGV.shift +if mode = ARGV.shift + 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 + RubyProf.const_get("#{printer.to_s.classify}Printer").new(results).print($stdout) + elsif RubyProf.const_defined?(:CallStackPrinter) + File.open("#{File.basename(path, '.rb')}.#{mode}.html", 'w') do |out| + RubyProf::CallStackPrinter.new(results).print(out) + end + else + File.open("#{File.basename(path, '.rb')}.#{mode}.callgrind", '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] |