Blame tests/performance/create-report.rb

Packit Service bf98b9
#!/usr/bin/env ruby
Packit Service bf98b9
#
Packit Service bf98b9
# ruby program to generate a performance report in PDF/png over git revisions, based on work
Packit Service bf98b9
# originally done for gegl by pippin@gimp.org, the original program is in the public domain.
Packit Service bf98b9
Packit Service bf98b9
require 'cairo'
Packit Service bf98b9
Packit Service bf98b9
def cairo_surface(w,h)
Packit Service bf98b9
    surface = Cairo::PDFSurface.new("report.pdf", w,h)
Packit Service bf98b9
    cr = Cairo::Context.new(surface)
Packit Service bf98b9
    yield(cr)
Packit Service bf98b9
end 
Packit Service bf98b9
Packit Service bf98b9
class Database
Packit Service bf98b9
Packit Service bf98b9
    def initialize()
Packit Service bf98b9
        @vals = Hash.new
Packit Service bf98b9
        @runs = Array.new
Packit Service bf98b9
        @colors = [
Packit Service bf98b9
          [0,1,0, 0.8],
Packit Service bf98b9
          [0,1,1, 0.8],
Packit Service bf98b9
          [1,0,0, 0.8],
Packit Service bf98b9
          [1,0,1, 0.8],
Packit Service bf98b9
          [1,1,0, 0.8],
Packit Service bf98b9
          #[0.5,0.5,0.5,0.8],
Packit Service bf98b9
          # gray doesnt have sufficient contrast against background
Packit Service bf98b9
          [0.5,0.5,1, 0.8],
Packit Service bf98b9
          [0.5,1,0.5, 0.8],
Packit Service bf98b9
          [0.5,1,1, 0.8],
Packit Service bf98b9
          [1,0.5,0.5, 0.8],
Packit Service bf98b9
          [1,0.5,1, 0.8],
Packit Service bf98b9
          [1,1,0.5, 0.8],
Packit Service bf98b9
          [1,1,1, 0.8],
Packit Service bf98b9
        ]
Packit Service bf98b9
        @width  = 1800
Packit Service bf98b9
        @height = 500
Packit Service bf98b9
Packit Service bf98b9
        @marginlx = 10
Packit Service bf98b9
        @marginrx = 180
Packit Service bf98b9
        @rgap = 40
Packit Service bf98b9
        @marginy = 10
Packit Service bf98b9
    end
Packit Service bf98b9
    def val_max(key)
Packit Service bf98b9
       max=0
Packit Service bf98b9
       @runs.each { |run|
Packit Service bf98b9
         val = @vals[key][run]
Packit Service bf98b9
         if val and val > max
Packit Service bf98b9
           max = val
Packit Service bf98b9
         end
Packit Service bf98b9
       }
Packit Service bf98b9
       max
Packit Service bf98b9
    end
Packit Service bf98b9
    def val_min(key)
Packit Service bf98b9
       min=9999990
Packit Service bf98b9
       @runs.each { |run|
Packit Service bf98b9
         val = @vals[key][run]
Packit Service bf98b9
         min = val  if val and val < min
Packit Service bf98b9
       }
Packit Service bf98b9
       #min
Packit Service bf98b9
       0   # this shows the relative noise in measurements better
Packit Service bf98b9
    end
Packit Service bf98b9
    def add_run(run)
Packit Service bf98b9
        @runs = @runs + [run]
Packit Service bf98b9
    end
Packit Service bf98b9
    def add_entry(run, name, val)
Packit Service bf98b9
        if !@vals[name]
Packit Service bf98b9
            @vals[name]=Hash.new
Packit Service bf98b9
        end
Packit Service bf98b9
        # check if there is an existing value,
Packit Service bf98b9
        # and perhaps have different behaviors
Packit Service bf98b9
        # associated with 
Packit Service bf98b9
        @vals[name][run] = val.to_f
Packit Service bf98b9
    end
Packit Service bf98b9
Packit Service bf98b9
    def drawbg cr
Packit Service bf98b9
      cr.set_source_rgba(0.2, 0.2, 0.2, 1)
Packit Service bf98b9
      cr.paint 
Packit Service bf98b9
Packit Service bf98b9
      i=0
Packit Service bf98b9
        @runs.each { |run|
Packit Service bf98b9
         if i % 2 == 1
Packit Service bf98b9
           cr.move_to 1.0 * i / @runs.length * (@width - @marginlx-@marginrx) + @marginlx, 0 * (@height - @marginy*2) + @marginy
Packit Service bf98b9
           cr.line_to 1.0 * i / @runs.length * (@width - @marginlx-@marginrx) + @marginlx, 1.0 * (@height - @marginy*2) + @marginy
Packit Service bf98b9
           cr.rel_line_to(1.0 / @runs.length * (@width - @marginlx-@marginrx), 0)
Packit Service bf98b9
           cr.rel_line_to(0, -(@height - @marginy*2))
Packit Service bf98b9
Packit Service bf98b9
           cr.set_source_rgba([0.25,0.25,0.25,1])
Packit Service bf98b9
           cr.fill
Packit Service bf98b9
         end
Packit Service bf98b9
         i+=1
Packit Service bf98b9
        }
Packit Service bf98b9
    end
Packit Service bf98b9
Packit Service bf98b9
    def drawtext cr
Packit Service bf98b9
      i = 0
Packit Service bf98b9
      @runs.each { |run|
Packit Service bf98b9
        y = i * 10 + 20
Packit Service bf98b9
        while y > @height - @marginy
Packit Service bf98b9
          y = y - @height + @marginy + 10
Packit Service bf98b9
        end
Packit Service bf98b9
        cr.move_to 1.0 * i / @runs.length * (@width - @marginlx-@marginrx) + @marginlx, y
Packit Service bf98b9
Packit Service bf98b9
        cr.set_source_rgba(0.6,0.6,0.6,1)
Packit Service bf98b9
        cr.show_text(run[0..6])
Packit Service bf98b9
        i+=1
Packit Service bf98b9
      }
Packit Service bf98b9
    end
Packit Service bf98b9
Packit Service bf98b9
    def draw_limits cr, key
Packit Service bf98b9
      cr.move_to @width - @marginrx + @rgap, 20
Packit Service bf98b9
      cr.set_source_rgba(1.0, 1.0, 1.0, 1.0)
Packit Service bf98b9
      cr.show_text(" #{val_max(key)} ")
Packit Service bf98b9
      cr.move_to @width - @marginrx + @rgap, @height - @marginy
Packit Service bf98b9
      cr.show_text(" #{val_min(key)} ")
Packit Service bf98b9
    end
Packit Service bf98b9
Packit Service bf98b9
    def draw_val cr, key, valno
Packit Service bf98b9
      min = val_min(key)
Packit Service bf98b9
      max = val_max(key)
Packit Service bf98b9
Packit Service bf98b9
      cr.set_source_rgba(@colors[valno])
Packit Service bf98b9
      cr.move_to(@width - @marginrx + @rgap, valno * 14 + @marginy + 20)
Packit Service bf98b9
      cr.show_text(key)
Packit Service bf98b9
Packit Service bf98b9
      cr.line_width = 2
Packit Service bf98b9
      cr.new_path
Packit Service bf98b9
Packit Service bf98b9
      i = 0
Packit Service bf98b9
      @runs.each { |run|
Packit Service bf98b9
        val = @vals[key][run]
Packit Service bf98b9
        if val 
Packit Service bf98b9
          cr.line_to 1.0 * (i+0.5) / @runs.length * (@width - @marginlx-@marginrx) + @marginlx,
Packit Service bf98b9
                     (1.0 - ((val-min) * 1.0 / (max - min))) * (@height - @marginy*2) + @marginy
Packit Service bf98b9
        end
Packit Service bf98b9
        i = i + 1
Packit Service bf98b9
      }
Packit Service bf98b9
      cr.stroke
Packit Service bf98b9
    end
Packit Service bf98b9
Packit Service bf98b9
    def create_report
Packit Service bf98b9
      cairo_surface(@width, @height) { |cr|
Packit Service bf98b9
        drawbg cr
Packit Service bf98b9
        valno = 0
Packit Service bf98b9
        @vals.each { |key, value|
Packit Service bf98b9
           draw_val cr, key, valno
Packit Service bf98b9
           valno += 1
Packit Service bf98b9
        }
Packit Service bf98b9
        drawtext cr
Packit Service bf98b9
        cr.target.write_to_png("report.png")
Packit Service bf98b9
Packit Service bf98b9
        valno = 0
Packit Service bf98b9
        @vals.each { |key, value|
Packit Service bf98b9
           cr.show_page
Packit Service bf98b9
           drawbg cr
Packit Service bf98b9
           draw_val cr, key, valno
Packit Service bf98b9
           drawtext cr
Packit Service bf98b9
           draw_limits cr, key
Packit Service bf98b9
           valno += 1
Packit Service bf98b9
        }
Packit Service bf98b9
      }
Packit Service bf98b9
    end
Packit Service bf98b9
end
Packit Service bf98b9
Packit Service bf98b9
generator = Database.new
Packit Service bf98b9
Packit Service bf98b9
items = File.open('jobs').each { |rev|
Packit Service bf98b9
  rev.strip!
Packit Service bf98b9
  generator.add_run(rev)
Packit Service bf98b9
  filename = "reports/" + rev;
Packit Service bf98b9
  if File.exist?(filename)
Packit Service bf98b9
      File.open(filename).each { |line| 
Packit Service bf98b9
         if line =~ /^@ (.*):(.*)/
Packit Service bf98b9
            generator.add_entry(rev, $1, $2)
Packit Service bf98b9
         end
Packit Service bf98b9
      }
Packit Service bf98b9
  end
Packit Service bf98b9
}
Packit Service bf98b9
Packit Service bf98b9
generator.create_report