#!/usr/bin/python3 """Generate a graph of the performance numbers, using pychart.""" from __future__ import print_function import dbm import pychart def get_timing(kind): """Inhale performance numbers for 'kind' from database.""" database = dbm.open('performance-numbers', 'r') list_ = [] for key in database.keys(): fields = key.split() if fields[0] == kind: set_size = float(fields[1]) duration = float(database[key]) list_.append((set_size, duration)) database.close() list_.sort() return list_ def get_hybrid_timing(): """Get hybrid backend numbers.""" return get_timing('hybrid') def get_array_timing(): """Get array backend numbers.""" return get_timing('array') def get_seek_timing(): """Get seek backend numbers.""" return get_timing('seek') def get_mmap_timing(): """Get mmap backend numbers.""" return get_timing('mmap') def desired_y_max(*list_): """Calculate the maximum duration for y.""" maximum = 0.0 for element in list_: for set_size, duration in element: maximum = max(duration, maximum) return maximum def main(): """Start the ball rolling.""" pychart.theme.get_options() pychart.theme.output_format = 'pdf' pychart.theme.use_color = 1 pychart.theme.output_file = 'performance-graph.pdf' pychart.theme.default_font_size = 15 pychart.theme.reinitialize() width = 800 height = width * 4 // 5 size = (width, height) hybrid_timing_data = get_hybrid_timing() print('hybrid', hybrid_timing_data) array_timing_data = get_array_timing() print('array', array_timing_data) seek_timing_data = get_seek_timing() print('seek', seek_timing_data) mmap_timing_data = get_mmap_timing() print('mmap', mmap_timing_data) y_max = desired_y_max(array_timing_data, seek_timing_data, hybrid_timing_data, mmap_timing_data) # can = pychart.canvas.default_canvas() ar = pychart.area.T( size=size, legend=pychart.legend.T(), x_range=(1, None), y_range=(0.0001, y_max + 100), x_coord=pychart.linear_coord.T(), y_coord=pychart.linear_coord.T(), x_axis=pychart.axis.X(format="%g", label="Number of elements in set"), y_axis=pychart.axis.Y(format="%g", label="Seconds"), ) lp = pychart.line_plot.T(data=array_timing_data, label="Array") ar.add_plot(lp) lp = pychart.line_plot.T(data=seek_timing_data, label="Seek") ar.add_plot(lp) lp = pychart.line_plot.T(data=hybrid_timing_data, label="Hybrid") ar.add_plot(lp) lp = pychart.line_plot.T(data=mmap_timing_data, label="mmap") ar.add_plot(lp) ar.draw() main()