Commit f3dd2e1b authored by Rene Saarsoo's avatar Rene Saarsoo
Browse files

Timer class for benchmarking.

In verbose mode the time spent in parsing and generating gets printed.
parent f2665553
Loading
Loading
Loading
Loading
+13 −7
Original line number Diff line number Diff line
@@ -6,6 +6,7 @@ require 'jsduck/tree'
require 'jsduck/tree_icons'
require 'jsduck/subclasses'
require 'jsduck/page'
require 'jsduck/timer'
require 'json'
require 'fileutils'

@@ -24,14 +25,18 @@ module JsDuck
      @template_dir = nil
      @input_files = []
      @verbose = false
      @timer = Timer.new
    end

    # Call this after input parameters set
    def run
      copy_template(@template_dir, @output_dir)
      classes = filter_classes(parse_files(@input_files))
      write_tree(@output_dir+"/output/tree.js", classes)
      write_pages(@output_dir+"/output", classes)
      result = parse_files(@input_files)
      classes = @timer.time(:parsing) { filter_classes(result) }
      @timer.time(:generating) { write_tree(@output_dir+"/output/tree.js", classes) }
      @timer.time(:generating) { write_pages(@output_dir+"/output", classes) }

      @timer.report if @verbose
    end

    # Given array of filenames, parses all files and returns array of
@@ -41,9 +46,9 @@ module JsDuck
      src = SourceFormatter.new(@output_dir + "/source")
      filenames.each do |fname|
        puts "Parsing #{fname} ..." if @verbose
        code = IO.read(fname)
        src_fname = src.write(code, fname)
        agr.parse(code, File.basename(fname), File.basename(src_fname))
        code = @timer.time(:parsing) { IO.read(fname) }
        src_fname = @timer.time(:generating) { src.write(code, fname) }
        @timer.time(:parsing) { agr.parse(code, File.basename(fname), File.basename(src_fname)) }
      end
      agr.result
    end
@@ -78,7 +83,8 @@ module JsDuck
      docs.each do |cls|
        filename = path + "/" + cls[:name] + ".html"
        puts "Writing to #{filename} ..." if @verbose
        File.open(filename, 'w') {|f| f.write( Page.new(cls, subclasses).to_html ) }
        html = Page.new(cls, subclasses).to_html
        File.open(filename, 'w') {|f| f.write(html) }
      end
    end

lib/jsduck/timer.rb

0 → 100644
+40 −0
Original line number Diff line number Diff line
module JsDuck

  # Helper for timing execution of named code blocks.
  #
  #     timer = Timer.new
  #     a = timer.time(:sum) { 5 + 5 }
  #     b = timer.time(:sum) { 5 + 5 }
  #     c = timer.time(:mult) { 5 * 5 }
  #     d = timer.time(:mult) { 5 * 5 }
  #     timer.report
  #
  # The #report method will print sum of the time spent in each
  # category.
  #
  class Timer
    def initialize
      @timings = {}
    end

    # Performs timing of one code block.
    # Returns the same value that code block returns.
    def time(name)
      begin_time = Time.now
      result = yield
      interval = Time.now - begin_time
      if @timings[name]
        @timings[name] += interval
      else
        @timings[name] = interval
      end
      result
    end

    # prints timings report to console
    def report
      @timings.each {|name, time| puts "#{name}:\t#{time} seconds" }
    end
  end

end