# HG changeset patch # User Pierre-Yves David <pierre-yves.david@octobus.net> # Date 1679578303 0 # Thu Mar 23 13:31:43 2023 +0000 # Node ID 8665188fd93995cb6872575858349b8c4abe5bae # Parent e2a31b27845cba9f62388520545c588ac28cf79a resulte-compare: make the key comparison more flexible We want to be able to configure it. diff --git a/python-libs/poulpe/bin/result-compare b/python-libs/poulpe/bin/result-compare --- a/python-libs/poulpe/bin/result-compare +++ b/python-libs/poulpe/bin/result-compare @@ -9,43 +9,68 @@ ('data-env-vars', 'name'), ('benchmark', 'name'), ('bin-env-vars', 'hg', 'flavor'), + ('bin-env-vars', 'hg', 'changeset', 'node'), ] -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)) +def get_value(key, result): + treck = list(key[::-1]) + current = result + while treck and current is not None: + k = treck.pop() + current = current.get(k) + return current + + +def make_key_result(compare_key): + headers_keys = [k for k in HEADERS_KEYS if k != compare_key] - variants = result['benchmark'].get('variants', {}) - for key, value in sorted(variants.items()): - headers.append((f"benchmark.variants.{key}", value)) - return tuple(headers) + def key_result(result): + headers = [] + for key in headers_keys: + value = get_value(key, result) + if value is not None: + headers.append((".".join(key), value)) + + variant_cmp_key = ".".join(compare_key) + variants = result['benchmark'].get('variants', {}) + for key, value in sorted(variants.items()): + key = f"benchmark.variants.{key}" + if key == variant_cmp_key: + continue + headers.append((key, value)) + return tuple(headers) + + return key_result def _rank(result): return result['bin-env-vars']['hg']['changeset']['rank'] -def dispatch_results(results): +def dispatch_results(results, compare_key): + key_func = make_key_result(compare_key) dispatched = collections.defaultdict(list) for r in results: - headers = key_result(r) + headers = key_func(r) dispatched[headers].append(r) for some_results in dispatched.values(): - some_results.sort(key=_rank) + key = SORT_KEYS.get(compare_key) + if key is None: + + def key(res): + val = get_value(compare_key, res) + if val is None: + val = '' + return val + + some_results.sort(key=key) return dispatched -def display_results(results): +def display_results(results, compare_key): for headers, some_results in sorted(results.items()): key_size = max(len(k) for k, v in headers) prefix = "###" @@ -57,7 +82,9 @@ base = None # display the result now for r in some_results: - key = r['bin-env-vars']['hg']['changeset']['node'][:12] + key = get_value(compare_key, r) + if compare_key[-1] == 'node': + key = key[:12] median = r['result']['time']['median'] if base is None: base = median @@ -75,6 +102,9 @@ click.echo(f"{key}: {median:6.6f} {display}") +SORT_KEYS = {('bin-env-vars', 'hg', 'changeset', 'node'): _rank} + + @click.command() @click.argument("file", type=click.File(), default="-") def result_compare(file): @@ -82,8 +112,9 @@ `poulpe result-search --content-as-json | poulpe result-compare`""" all_results = json.load(file) - results = dispatch_results(all_results) - display_results(results) + compare_key = ('bin-env-vars', 'hg', 'changeset', 'node') + results = dispatch_results(all_results, compare_key) + display_results(results, compare_key) if __name__ == "__main__":