diff --git a/bin/result-compare b/bin/result-compare new file mode 100755 index 0000000000000000000000000000000000000000..6e31f69e876542dbd822898f6111a062676059db_YmluL3Jlc3VsdC1jb21wYXJl --- /dev/null +++ b/bin/result-compare @@ -0,0 +1,86 @@ +#!/usr/bin/env python3 +# +# compare many result together, use it with `result-search --content-as-json` + +import argparse +import collections +import json +import os +import sys + +poulpe_root = os.path.dirname(os.path.dirname(sys.argv[0])) +sys.path.insert(0, os.path.join(poulpe_root, 'python-libs')) + +import poulpe + + +HEADERS_KEYS = [ + ('data-env-vars', 'name'), + ('benchmark', 'name'), + ('bin-env-vars', 'hg', 'flavor'), +] + + +def key_result(result): + headers = [] + for key in HEADERS_KEYS: + treck = list(key[::-1]) + current = result + while treck and current is not None: + k = treck.pop() + current = current.get(k) + if current is not None: + headers.append((".".join(key), current)) + return tuple(headers) + + +def _rank(result): + return result['bin-env-vars']['hg']['changeset']['rank'] + + +def dispatch_results(results): + dispatched = collections.defaultdict(list) + for r in results: + headers = key_result(r) + dispatched[headers].append(r) + + for some_results in dispatched.values(): + some_results.sort(key=_rank) + + return dispatched + + +def display_results(results): + for headers, some_results in results.items(): + key_size = max(len(k) for k, v in headers) + prefix = "###" + for k, v in headers: + k = k.ljust(key_size) + print(f'{prefix} {k} = {v}') + prefix = " #" + + # display the result now + for r in some_results: + key = r['bin-env-vars']['hg']['changeset']['node'][:12] + median = r['result']['time']['median'] + print(f"{key}: {median:6.6f}") + + +def _parsers(): + cmd_parser = argparse.ArgumentParser(prog='result-search') + return cmd_parser + + +def main(args): + parser = _parsers() + param = parser.parse_args(args) + all_results = json.load(sys.stdin) + results = dispatch_results(all_results) + display_results(results) + return 0 + + +if __name__ == "__main__": + ret = main(sys.argv[1:]) + assert ret is not None + sys.exit(ret)