diff --git a/suites/hg/benchmarks/perf-delta-find.pbd b/suites/hg/benchmarks/perf-delta-find.pbd new file mode 100644 index 0000000000000000000000000000000000000000..3e5cfc11e27afd9ef5527160060b88598e62d69a_c3VpdGVzL2hnL2JlbmNobWFya3MvcGVyZi1kZWx0YS1maW5kLnBiZA== --- /dev/null +++ b/suites/hg/benchmarks/perf-delta-find.pbd @@ -0,0 +1,57 @@ +[meta] +format="0" +name="perf-delta-find" +method="mercurial-perf-extension" + +[run] +copy-data-env = false + +[hg-perf-ext] +command="perf::delta-find" +cwd="DATA-VARS:mercurial.main-repo-path" + +[hg-perf-ext.variants.dimensions.rev.manifest-snapshot-any-tries-a] +args=["--manifest", "DATA-VARS:mercurial.revlog.delta-find.manifest.snapshot.many-tries.a"] + +[hg-perf-ext.variants.dimensions.rev.manifest-snapshot-many-tries-b] +args=["--manifest", "DATA-VARS:mercurial.revlog.delta-find.manifest.snapshot.many-tries.b"] + +[hg-perf-ext.variants.dimensions.rev.manifest-snapshot-many-tries-c] +args=["--manifest", "DATA-VARS:mercurial.revlog.delta-find.manifest.snapshot.many-tries.c"] + +[hg-perf-ext.variants.dimensions.rev.manifest-snapshot-many-tries-d] +args=["--manifest", "DATA-VARS:mercurial.revlog.delta-find.manifest.snapshot.many-tries.d"] + +[hg-perf-ext.variants.dimensions.rev.manifest-snapshot-many-tries-e] +args=["--manifest", "DATA-VARS:mercurial.revlog.delta-find.manifest.snapshot.many-tries.e"] + +[hg-perf-ext.variants.dimensions.rev.manifest-snapshot-many-rounds-a] +args=["--manifest", "DATA-VARS:mercurial.revlog.delta-find.manifest.snapshot.many-rounds.a"] + +[hg-perf-ext.variants.dimensions.rev.manifest-snapshot-many-rounds-b] +args=["--manifest", "DATA-VARS:mercurial.revlog.delta-find.manifest.snapshot.many-rounds.b"] + +[hg-perf-ext.variants.dimensions.rev.manifest-snapshot-many-rounds-c] +args=["--manifest", "DATA-VARS:mercurial.revlog.delta-find.manifest.snapshot.many-rounds.c"] + +[hg-perf-ext.variants.dimensions.rev.manifest-snapshot-many-rounds-d] +args=["--manifest", "DATA-VARS:mercurial.revlog.delta-find.manifest.snapshot.many-rounds.d"] + +[hg-perf-ext.variants.dimensions.rev.manifest-snapshot-many-rounds-e] +args=["--manifest", "DATA-VARS:mercurial.revlog.delta-find.manifest.snapshot.many-rounds.e"] + +[hg-perf-ext.variants.dimensions.rev.manifest-snapshot-many-both-a] +default=true +args=["--manifest", "DATA-VARS:mercurial.revlog.delta-find.manifest.snapshot.many-both.a"] + +[hg-perf-ext.variants.dimensions.rev.manifest-snapshot-many-both-b] +args=["--manifest", "DATA-VARS:mercurial.revlog.delta-find.manifest.snapshot.many-both.b"] + +[hg-perf-ext.variants.dimensions.rev.manifest-snapshot-many-both-c] +args=["--manifest", "DATA-VARS:mercurial.revlog.delta-find.manifest.snapshot.many-both.c"] + +[hg-perf-ext.variants.dimensions.rev.manifest-snapshot-many-both-d] +args=["--manifest", "DATA-VARS:mercurial.revlog.delta-find.manifest.snapshot.many-both.d"] + +[hg-perf-ext.variants.dimensions.rev.manifest-snapshot-many-both-e] +args=["--manifest", "DATA-VARS:mercurial.revlog.delta-find.manifest.snapshot.many-both.e"] diff --git a/suites/hg/setup-data/setup-55-delta-chain.py b/suites/hg/setup-data/setup-55-delta-chain.py new file mode 100755 index 0000000000000000000000000000000000000000..3e5cfc11e27afd9ef5527160060b88598e62d69a_c3VpdGVzL2hnL3NldHVwLWRhdGEvc2V0dXAtNTUtZGVsdGEtY2hhaW4ucHk= --- /dev/null +++ b/suites/hg/setup-data/setup-55-delta-chain.py @@ -0,0 +1,112 @@ +#!/usr/bin/env python3 +"""Find suitable revision to run delta-find benchmark on +""" +import json +import pathlib +import subprocess +import sys + +import poulpe.dataenvs + +if len(sys.argv) != 2: + script_name = os.path.basename(sys.argv[0]) + print(f"USAGE: {script_name} DATA-ENV-PATH", file=sys.stderr) + print(" DATA-ENV-PATH: the path to that data-env", file=sys.stderr) + sys.exit(32) + +data_env_directory = pathlib.Path(sys.argv[1]) +desc_path = data_env_directory / "data-env.poulpe" + +data_env = poulpe.dataenvs.get_data_env(data_env_directory) + +main_repo= data_env.get_benchmark_input_vars("mercurial.main-repo-path") + +repo_path = data_env_directory / main_repo + +cmd = [ + 'hg', + '--repository', + repo_path, + 'debugdeltachain', + '--template', + 'json', + '--manifest', +] +proc = subprocess.run(cmd, stdout=subprocess.PIPE, encoding='utf8') +proc.check_returncode() +delta_chain_data = json.loads(proc.stdout) + +all_data = {} + +target_type =('base', 'snap') +for rev_info in delta_chain_data: + if rev_info['deltatype'] not in target_type: + continue + + cmd = [ + 'hg', + '--repository', + repo_path, + 'debug-delta-find', + '--manifest', + '%d' % rev_info['rev'] + ] + proc = subprocess.run(cmd, stdout=subprocess.PIPE, encoding='utf8') + proc.check_returncode() + data = None + for line in proc.stdout.splitlines(): + if line.startswith('DBG-DELTAS: MANIFESTLOG:'): + pieces = line.split() + data = {} + for p in pieces: + if '=' in p: + k, v = p.split('=', 1) + if '.' in v: + try: + v = float(v) + except ValueError: + pass + else: + try: + v = int(v) + except ValueError: + pass + data[k] = v + break + if data is not None: + all_data[rev_info['rev']] = data + +items = list(all_data.items()) + + +def set_one(key, value): + cmd = [ + 'env-desc', + 'set', + str(desc_path), + f'bench-input-vars.mercurial.revlog.delta-find.manifest.{key}', + str(value), + ] + subprocess.check_call(cmd) + + +# search snapshot with the most total try +items.sort(key=lambda i: (i[1]['try-count'], i[0])) +max_tries = items[:-6:-1] +for i, r in enumerate(max_tries): + c = chr(ord('a') + i) + set_one(f'snapshot.many-tries.{c}', r[0]) + +# search snapshot with the most search-rounds +items.sort(key=lambda i: (i[1]['search-rounds'], i[0])) +max_round = items[:-6:-1] +for i, r in enumerate(max_round): + c = chr(ord('a') + i) + set_one(f'snapshot.many-rounds.{c}', r[0]) + +# search snapshot with the most `try * rounds` +items.sort(key=lambda i: (i[1]['try-count'] * i[1]['search-rounds'], i[0])) +max_combined = items[:-6:-1] +for i, r in enumerate(max_combined): + c = chr(ord('a') + i) + set_one(f'snapshot.many-both.{c}', r[0]) diff --git a/suites/hg/setup-data/setup-full.sh b/suites/hg/setup-data/setup-full.sh index 4294bc734731f1f405bcdfbeaee41b91e5c9b246_c3VpdGVzL2hnL3NldHVwLWRhdGEvc2V0dXAtZnVsbC5zaA==..3e5cfc11e27afd9ef5527160060b88598e62d69a_c3VpdGVzL2hnL3NldHVwLWRhdGEvc2V0dXAtZnVsbC5zaA== 100755 --- a/suites/hg/setup-data/setup-full.sh +++ b/suites/hg/setup-data/setup-full.sh @@ -38,3 +38,5 @@ "${script_dir}"/setup-10-format.sh $data_env_directory echo "setup for \`hg status\` benchmark" "${script_dir}"/setup-50-status.sh $data_env_directory +echo "setup for \`delta-find\` benchmark" +"${script_dir}"/setup-55-delta-chain.py $data_env_directory diff --git a/tests/test-data-setup.t b/tests/test-data-setup.t index 4294bc734731f1f405bcdfbeaee41b91e5c9b246_dGVzdHMvdGVzdC1kYXRhLXNldHVwLnQ=..3e5cfc11e27afd9ef5527160060b88598e62d69a_dGVzdHMvdGVzdC1kYXRhLXNldHVwLnQ= 100644 --- a/tests/test-data-setup.t +++ b/tests/test-data-setup.t @@ -4,6 +4,7 @@ This tests the data setup script for Mercurial. $ PATH="${TESTDIR}/../bin:$PATH" + $ PYTHONPATH="${TESTDIR}/../python-libs:$PYTHONPATH" $ SETUP_PATH="${TESTDIR}/../suites/hg/setup-data/" Basic manual setup of the data-env data @@ -33,8 +34,9 @@ register graph details register the format details setup for `hg status` benchmark + setup for `delta-find` benchmark $ env-desc show my-data-env/data-env.poulpe bench-input-vars: mercurial: main-repo-path = base-repo @@ -36,8 +38,30 @@ $ env-desc show my-data-env/data-env.poulpe bench-input-vars: mercurial: main-repo-path = base-repo + revlog: + delta-find: + manifest: + snapshot: + many-both: + a = 8152 + b = 11355 + c = 9151 + d = 6939 + e = 4345 + many-rounds: + a = 11355 + b = 9151 + c = 8152 + d = 5345 + e = 3311 + many-tries: + a = 8152 + b = 6939 + c = 11355 + d = 9151 + e = 4345 status: clean: no-iu = base-repo