xls-report.py: Added an option to show per-pixel times
authorRoman Donchenko <roman.donchenko@itseez.com>
Wed, 10 Jul 2013 10:50:51 +0000 (14:50 +0400)
committerRoman Donchenko <roman.donchenko@itseez.com>
Wed, 10 Jul 2013 10:58:51 +0000 (14:58 +0400)
modules/ts/misc/xls-report.py

index b120484..d5db73d 100755 (executable)
@@ -104,6 +104,7 @@ bad_speedup_style = xlwt.easyxf('font: color red', num_format_str='#0.00')
 no_speedup_style = no_time_style
 error_speedup_style = xlwt.easyxf('pattern: pattern solid, fore_color orange')
 header_style = xlwt.easyxf('font: bold true; alignment: horizontal centre, vertical top, wrap True')
+subheader_style = xlwt.easyxf('alignment: horizontal centre, vertical top')
 
 class Collector(object):
     def __init__(self, config_match_func, include_unmatched):
@@ -193,6 +194,8 @@ def main():
     arg_parser.add_argument('-c', '--config', metavar='CONF', help='global configuration file')
     arg_parser.add_argument('--include-unmatched', action='store_true',
         help='include results from XML files that were not recognized by configuration matchers')
+    arg_parser.add_argument('--show-times-per-pixel', action='store_true',
+        help='for tests that have an image size parameter, show per-pixel time, as well as total time')
 
     args = arg_parser.parse_args()
 
@@ -246,21 +249,53 @@ def main():
         sheet.row(2).height = 800
         sheet.panes_frozen = True
         sheet.remove_splits = True
-        sheet.horz_split_pos = 3
-        sheet.horz_split_first_visible = 3
 
         sheet_comparisons = sheet_conf.get('comparisons', [])
 
-        for i, w in enumerate([2500, 10000, 2500, 2000, 7500]
-                + (len(config_names) + 1 + len(sheet_comparisons)) * [4000]):
-            sheet.col(i).width = w
+        row = 2
 
-        for i, caption in enumerate(['Module', 'Test', 'Image\nsize', 'Data\ntype', 'Other parameters']
-                + config_names + [None]
-                + [comp['to'] + '\nvs\n' + comp['from'] for comp in sheet_comparisons]):
-            sheet.row(2).write(i, caption, header_style)
+        col = 0
 
-        row = 3
+        for (w, caption) in [
+                (2500, 'Module'),
+                (10000, 'Test'),
+                (2500, 'Image\nsize'),
+                (2000, 'Data\ntype'),
+                (7500, 'Other parameters')]:
+            sheet.col(col).width = w
+            if args.show_times_per_pixel:
+                sheet.write_merge(row, row + 1, col, col, caption, header_style)
+            else:
+                sheet.write(row, col, caption, header_style)
+            col += 1
+
+        for config_name in config_names:
+            if args.show_times_per_pixel:
+                sheet.col(col).width = 3000
+                sheet.col(col + 1).width = 3000
+                sheet.write_merge(row, row, col, col + 1, config_name, header_style)
+                sheet.write(row + 1, col, 'total, ms', subheader_style)
+                sheet.write(row + 1, col + 1, 'per pixel, ns', subheader_style)
+                col += 2
+            else:
+                sheet.col(col).width = 4000
+                sheet.write(row, col, config_name, header_style)
+                col += 1
+
+        col += 1 # blank column between configurations and comparisons
+
+        for comp in sheet_comparisons:
+            sheet.col(col).width = 4000
+            caption = comp['to'] + '\nvs\n' + comp['from']
+            if args.show_times_per_pixel:
+                sheet.write_merge(row, row + 1, col, col, caption, header_style)
+            else:
+                sheet.write(row, col, caption, header_style)
+
+        row += 2 if args.show_times_per_pixel else 1
+
+        sheet.horz_split_pos = row
+        sheet.horz_split_first_visible = row
 
         module_colors = sheet_conf.get('module_colors', {})
         module_styles = {module: xlwt.easyxf('pattern: pattern solid, fore_color {}'.format(color))
@@ -284,16 +319,36 @@ def main():
                     del param_list[param_list.index(data_type)]
 
                 sheet.row(row).write(4, ' | '.join(param_list))
-                for i, c in enumerate(config_names):
+
+                col = 5
+
+                for c in config_names:
                     if c in configs:
-                        sheet.write(row, 5 + i, configs[c], time_style)
+                        sheet.write(row, col, configs[c], time_style)
                     else:
-                        sheet.write(row, 5 + i, None, no_time_style)
-
-                for i, comp in enumerate(sheet_comparisons):
+                        sheet.write(row, col, None, no_time_style)
+                    col += 1
+                    if args.show_times_per_pixel:
+                        sheet.write(row, col,
+                          xlwt.Formula(
+                            '''
+                              {0} * 1000000 / (
+                                VALUE(MID({1}; 1; SEARCH("x"; {1}) - 1))
+                                  * VALUE(MID({1}; SEARCH("x"; {1}) + 1; LEN({1})))
+                              )
+                            '''.replace('\n', '').replace(' ', '').format(
+                              xlwt.Utils.rowcol_to_cell(row, col - 1),
+                              xlwt.Utils.rowcol_to_cell(row, 2)
+                            )
+                          ),
+                          time_style)
+                        col += 1
+
+                col += 1 # blank column
+
+                for comp in sheet_comparisons:
                     cmp_from = configs.get(comp["from"])
                     cmp_to = configs.get(comp["to"])
-                    col = 5 + len(config_names) + 1 + i
 
                     if isinstance(cmp_from, numbers.Number) and isinstance(cmp_to, numbers.Number):
                         try:
@@ -306,6 +361,8 @@ def main():
                     else:
                         sheet.write(row, col, None, no_speedup_style)
 
+                    col += 1
+
                 row += 1
                 if row % 1000 == 0: sheet.flush_row_data()