瀏覽代碼

Write some utilities that manipulate perf data

jonathanvdc 8 年之前
父節點
當前提交
e223ba1b04
共有 3 個文件被更改,包括 108 次插入0 次删除
  1. 54 0
      performance/perf_max.py
  2. 36 0
      performance/perf_stats.py
  3. 18 0
      performance/utils.py

+ 54 - 0
performance/perf_max.py

@@ -0,0 +1,54 @@
+"""Computes the maximal value for a given selection of quantities, optimization levels
+   and test names."""
+
+import sys
+import argparse
+from collections import defaultdict
+import utils
+
+def main():
+    arg_parser = argparse.ArgumentParser()
+    arg_parser.add_argument('input', help='The performance data file.')
+    arg_parser.add_argument(
+        '-q',
+        '--quantity',
+        type=str,
+        help="The quantity to filter on. Defaults to '%s'" %
+        utils.TOTAL_TIME_QUANTITY,
+        default=utils.TOTAL_TIME_QUANTITY)
+    arg_parser.add_argument(
+        '-O',
+        '--opt',
+        type=str,
+        nargs='*',
+        help="Filters on optimization levels.")
+    arg_parser.add_argument(
+        '-t', '--test', type=str, nargs='*', help="Filters on tests.")
+
+    args = arg_parser.parse_args()
+
+    perf_data = utils.parse_perf_data(args.input)[args.quantity]
+
+    if args.opt:
+        optimization_set = set(args.opt)
+        perf_data = [(optimization_level, measurements)
+                     for optimization_level, measurements in perf_data
+                     if optimization_level in optimization_set]
+
+    if args.test:
+        test_set = set(args.test)
+        new_perf_data = []
+        for optimization_level, measurements in perf_data:
+            new_measurements = []
+            for test_name, data_point in measurements:
+                if test_name in test_set:
+                    new_measurements.append((test_name, data_point))
+
+            if len(new_measurements) > 0:
+                new_perf_data.append((optimization_level, new_measurements))
+        perf_data = new_perf_data
+
+    print(max(max(data_point for _, data_point in measurements) for _, measurements in perf_data))
+
+if __name__ == '__main__':
+    main()

+ 36 - 0
performance/perf_stats.py

@@ -0,0 +1,36 @@
+"""Computes statistiscs from raw performance results."""
+
+import sys
+import argparse
+from collections import defaultdict
+import utils
+
+def main():
+    arg_parser = argparse.ArgumentParser()
+    arg_parser.add_argument('input', help='The performance data file.')
+
+    args = arg_parser.parse_args()
+
+    perf_data = utils.parse_perf_data(args.input)
+
+    for quantity, opt_level_dict in perf_data.items():
+        for opt_level, data_points in opt_level_dict:
+            perf_per_test = defaultdict(list)
+            for test_name, measurement in data_points:
+                perf_per_test[test_name].append(measurement)
+
+            for test_name, measurement_list in perf_per_test.items():
+                utils.write_perf_entry_to_stream(
+                    test_name, opt_level, quantity,
+                    utils.mean(measurement_list), sys.stdout)
+                if len(measurement_list) > 1:
+                    utils.write_perf_entry_to_stream(
+                        test_name, opt_level, quantity + '-standard-deviation',
+                        utils.standard_deviation(measurement_list), sys.stdout)
+
+                utils.write_perf_entry_to_stream(
+                    test_name, opt_level, quantity + '-sample-size',
+                    len(measurement_list), sys.stdout)
+
+if __name__ == '__main__':
+    main()

+ 18 - 0
performance/utils.py

@@ -278,6 +278,11 @@ def mean(values):
     """Computes the arithmetic mean of the given values."""
     return float(sum(values)) / max(len(values), 1)
 
+def standard_deviation(values):
+    """Computes the standard deviation of the given values."""
+    avg = mean(values)
+    return (sum((val - avg) ** 2 for val in values) / (len(values) - 1)) ** 0.5
+
 def parse_jit_timing_log(log_file):
     """Parses the JIT timing log entries from the given file."""
     results = []
@@ -447,3 +452,16 @@ def parse_perf_data(file_name):
         quantity: sorted(result_dict.items(), key=operator.itemgetter(0))
         for quantity, result_dict in results.items()
     }
+
+def write_perf_data_to_stream(perf_data, output_stream):
+    """Writes the given performance data to the given file."""
+    for quantity, opt_level_dict in perf_data.items():
+        for opt_level, data_points in opt_level_dict:
+            for test_name, measurement in data_points:
+                write_perf_entry_to_stream(
+                    test_name, opt_level, quantity, measurement, output_stream)
+
+def write_perf_data_to_file(perf_data, file_name):
+    """Writes the given performance data to the given file."""
+    with open(file_name, 'w') as perf_file:
+        write_perf_data_to_stream(perf_data, perf_file)