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)