Skip to content

Commit 0250aff

Browse files
committed
benches: update benchmarks for pkgcraft dep changes
1 parent 8dbca00 commit 0250aff

5 files changed

Lines changed: 132 additions & 132 deletions

File tree

benches/atom_memory_usage.py

Lines changed: 0 additions & 54 deletions
This file was deleted.

benches/dep_memory_usage.py

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
# Script to roughly benchmark memory usage for package dependency object
2+
# instances between pkgcraft, pkgcore, and portage.
3+
4+
import os
5+
import sys
6+
import time
7+
from random import randrange
8+
9+
import humanize
10+
import psutil
11+
from pkgcore.ebuild.atom import atom as pkgcore_dep
12+
from portage.dep import Atom as portage_dep
13+
14+
from pkgcraft.dep import PkgDep as pkgcraft_dep
15+
16+
eprint = lambda x: print(x, file=sys.stderr)
17+
18+
dep_funcs = [
19+
("pkgcraft", pkgcraft_dep),
20+
("pkgcraft-cached", pkgcraft_dep.cached),
21+
("pkgcore", pkgcore_dep),
22+
("portage", portage_dep),
23+
]
24+
25+
26+
def test(deps):
27+
eprint("---------------------------------------")
28+
eprint("{:<20} {:<10} time".format("implementation", "memory"))
29+
eprint("---------------------------------------")
30+
for impl, func in dep_funcs:
31+
if _pid := os.fork():
32+
os.wait()
33+
else:
34+
proc = psutil.Process()
35+
base = proc.memory_info().rss
36+
start = time.time()
37+
_deps = [func(x) for x in deps]
38+
elapsed = time.time() - start
39+
size = humanize.naturalsize(proc.memory_info().rss - base)
40+
eprint(f"{impl:<20} {size:<10} {elapsed:.{2}f}s")
41+
os._exit(0)
42+
43+
44+
if __name__ == "__main__":
45+
num_deps = 1000000
46+
47+
eprint(f"\nStatic deps ({num_deps})")
48+
test(("cat/pkg" for _ in range(num_deps)))
49+
50+
eprint(f"\nDynamic deps ({num_deps})")
51+
test((f"=cat/pkg-{x}-r1:2/3[a,b,c]" for x in range(num_deps)))
52+
53+
eprint(f"\nRandom deps ({num_deps})")
54+
test((f"=cat/pkg-{randrange(9999)}-r1:2/3[a,b,c]" for _ in range(num_deps)))

benches/test_atom.py

Lines changed: 0 additions & 62 deletions
This file was deleted.

benches/test_dep.py

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
import pytest
2+
from pkgcore.ebuild.atom import atom as pkgcore_dep
3+
from portage.dep import Atom as portage_dep
4+
5+
from pkgcraft.dep import PkgDep as pkgcraft_dep
6+
7+
pytest_plugins = ("benchmark", "pkgcraft")
8+
9+
10+
def random_dep(func, random_str):
11+
cat = random_str()
12+
pkg = random_str()
13+
s = f"=cat_{cat}/pkg_{pkg}-1-r2:3/4=[a,b,c]"
14+
return func(s)
15+
16+
17+
dep_funcs = [
18+
("pkgcraft", pkgcraft_dep),
19+
("pkgcraft", pkgcraft_dep.cached),
20+
("pkgcore", pkgcore_dep),
21+
("portage", portage_dep),
22+
]
23+
24+
25+
@pytest.mark.parametrize("_lib,func", dep_funcs)
26+
def test_bench_dep_static(benchmark, _lib, func):
27+
benchmark(func, "=cat/pkg-1-r2:3/4=[a,b,c]")
28+
29+
30+
@pytest.mark.parametrize("_lib,func", dep_funcs)
31+
def test_bench_dep_random(benchmark, random_str, _lib, func):
32+
benchmark(random_dep, func, random_str)
33+
34+
35+
@pytest.mark.parametrize("_lib,func", dep_funcs)
36+
def test_bench_dep_property(benchmark, _lib, func):
37+
dep = func("=cat/pkg-1-r2:3/4=[a,b,c]")
38+
version = benchmark(getattr, dep, "version")
39+
assert str(version).startswith("1")
40+
41+
42+
@pytest.mark.parametrize("_lib,func", dep_funcs)
43+
def test_bench_dep_property_none(benchmark, _lib, func):
44+
dep = func("cat/pkg")
45+
version = benchmark(getattr, dep, "version")
46+
assert version is None
47+
48+
49+
# portage deps don't natively support comparisons
50+
@pytest.mark.parametrize("_lib,func", (("pkgcraft", pkgcraft_dep), ("pkgcore", pkgcore_dep)))
51+
def test_bench_dep_sorting_worst_case(benchmark, _lib, func):
52+
deps = [func(f"=cat/pkg-{v}-r1:2/3=[a,b,c]") for v in reversed(range(100))]
53+
result = benchmark(sorted, deps)
54+
assert result == list(reversed(deps))
55+
56+
57+
# portage deps don't natively support comparisons
58+
@pytest.mark.parametrize("_lib,func", (("pkgcraft", pkgcraft_dep), ("pkgcore", pkgcore_dep)))
59+
def test_bench_dep_sorting_best_case(benchmark, _lib, func):
60+
deps = [func(f"=cat/pkg-{v}-r1:2/3=[a,b,c]") for v in range(100)]
61+
result = benchmark(sorted, deps)
62+
assert result == deps

benches/test_repo.py

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import pytest
2-
from pkgcore.ebuild.atom import atom as pkgcore_atom
2+
from pkgcore.ebuild.atom import atom as pkgcore_dep
33

4-
from pkgcraft.atom import Atom
4+
from pkgcraft.dep import PkgDep as pkgcraft_dep
55
from pkgcraft.repo import RepoSet
66

77
pytest_plugins = ("benchmark", "pkgcraft")
@@ -27,14 +27,14 @@ def test_bench_ebuild_repo_iter(benchmark, lib, ebuild_repo):
2727
assert len(pkgs) == 100
2828

2929

30-
@pytest.mark.parametrize("lib,func", (("pkgcraft", Atom), ("pkgcore", pkgcore_atom)))
31-
def test_bench_ebuild_repo_iter_restrict_atom(benchmark, lib, func, ebuild_repo):
30+
@pytest.mark.parametrize("lib,func", (("pkgcraft", pkgcraft_dep), ("pkgcore", pkgcore_dep)))
31+
def test_bench_ebuild_repo_iter_restrict_dep(benchmark, lib, func, ebuild_repo):
3232
# create ebuilds
3333
for i in range(100):
3434
ebuild_repo.create_ebuild(f"cat/pkg-{i}")
3535

36-
# single atom restriction
37-
atom = func("=cat/pkg-50")
36+
# single dep restriction
37+
dep = func("=cat/pkg-50")
3838

3939
if lib == "pkgcore":
4040
from pkgcore.ebuild import repo_objs, repository
@@ -43,9 +43,9 @@ def test_bench_ebuild_repo_iter_restrict_atom(benchmark, lib, func, ebuild_repo)
4343
location=str(ebuild_repo.path), disable_inst_caching=True
4444
)
4545
r = repository.UnconfiguredTree(str(ebuild_repo.path), repo_config=repo_config)
46-
pkgs = benchmark(lambda x: list(r.itermatch(x)), atom)
46+
pkgs = benchmark(lambda x: list(r.itermatch(x)), dep)
4747
else:
48-
pkgs = benchmark(lambda x: list(ebuild_repo.iter_restrict(x)), atom)
48+
pkgs = benchmark(lambda x: list(ebuild_repo.iter_restrict(x)), dep)
4949

5050
assert len(pkgs) == 1
5151
assert str(pkgs[0].version) == "50"
@@ -58,14 +58,14 @@ def test_bench_fake_repo_iter(benchmark, fake_repo):
5858
assert len(pkgs) == 100
5959

6060

61-
def test_bench_fake_repo_iter_restrict_atom(benchmark, fake_repo):
61+
def test_bench_fake_repo_iter_restrict_dep(benchmark, fake_repo):
6262
# create pkgs
6363
fake_repo.extend([f"cat/pkg-{i}" for i in range(100)])
6464

65-
# single atom restriction
66-
atom = Atom("=cat/pkg-50")
65+
# single dep restriction
66+
dep = pkgcraft_dep("=cat/pkg-50")
6767

68-
pkgs = benchmark(lambda x: list(fake_repo.iter_restrict(x)), atom)
68+
pkgs = benchmark(lambda x: list(fake_repo.iter_restrict(x)), dep)
6969
assert len(pkgs) == 1
7070
assert str(pkgs[0].version) == "50"
7171

@@ -84,7 +84,7 @@ def test_bench_repo_set_iter(benchmark, make_ebuild_repo):
8484
assert len(pkgs) == 100
8585

8686

87-
def test_bench_repo_set_iter_restrict_atom(benchmark, make_ebuild_repo):
87+
def test_bench_repo_set_iter_restrict_dep(benchmark, make_ebuild_repo):
8888
r1 = make_ebuild_repo()
8989
r2 = make_ebuild_repo()
9090
# create ebuilds
@@ -93,11 +93,11 @@ def test_bench_repo_set_iter_restrict_atom(benchmark, make_ebuild_repo):
9393
for i in range(50, 100):
9494
r2.create_ebuild(f"cat/pkg-{i}")
9595

96-
# single atom restriction
97-
atom = Atom("=cat/pkg-50")
96+
# single dep restriction
97+
dep = pkgcraft_dep("=cat/pkg-50")
9898

9999
repos = RepoSet(r1, r2)
100-
pkgs = benchmark(lambda x: list(repos.iter_restrict(x)), atom)
100+
pkgs = benchmark(lambda x: list(repos.iter_restrict(x)), dep)
101101

102102
assert len(pkgs) == 1
103103
assert str(pkgs[0].version) == "50"

0 commit comments

Comments
 (0)