Skip to content

Commit bceaf41

Browse files
committed
Another placeholder benchmark for future optimization.
1 parent b20234e commit bceaf41

File tree

1 file changed

+106
-0
lines changed

1 file changed

+106
-0
lines changed
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
2+
"""
3+
A benchmark for validation of applicators containing lots of useless schemas.
4+
5+
Signals a small possible optimization to remove all such schemas ahead of time.
6+
"""
7+
8+
from pyperf import Runner
9+
10+
from jsonschema import Draft202012Validator as Validator
11+
12+
NUM_USELESS = 100000
13+
14+
subschema = {"const": 37}
15+
16+
valid = 37
17+
invalid = 12
18+
19+
baseline = Validator(subschema)
20+
21+
22+
# These should be indistinguishable from just `subschema`
23+
by_name = {
24+
"single subschema": {
25+
"anyOf": Validator({"anyOf": [subschema]}),
26+
"allOf": Validator({"allOf": [subschema]}),
27+
"oneOf": Validator({"oneOf": [subschema]}),
28+
},
29+
"redundant subschemas": {
30+
"anyOf": Validator({"anyOf": [subschema] * NUM_USELESS}),
31+
"allOf": Validator({"allOf": [subschema] * NUM_USELESS}),
32+
},
33+
"useless successful subschemas (beginning)": {
34+
"anyOf": Validator({"anyOf": [subschema, *[True] * NUM_USELESS]}),
35+
"allOf": Validator({"allOf": [subschema, *[True] * NUM_USELESS]}),
36+
},
37+
"useless successful subschemas (middle)": {
38+
"anyOf": Validator(
39+
{
40+
"anyOf": [
41+
*[True] * (NUM_USELESS // 2),
42+
subschema,
43+
*[True] * (NUM_USELESS // 2),
44+
],
45+
},
46+
),
47+
"allOf": Validator(
48+
{
49+
"allOf": [
50+
*[True] * (NUM_USELESS // 2),
51+
subschema,
52+
*[True] * (NUM_USELESS // 2),
53+
],
54+
},
55+
),
56+
},
57+
"useless successful subschemas (end)": {
58+
"anyOf": Validator({"anyOf": [*[True] * NUM_USELESS, subschema]}),
59+
"allOf": Validator({"allOf": [*[True] * NUM_USELESS, subschema]}),
60+
},
61+
"useless failing subschemas (beginning)": {
62+
"anyOf": Validator({"anyOf": [subschema, *[False] * NUM_USELESS]}),
63+
"oneOf": Validator({"oneOf": [subschema, *[False] * NUM_USELESS]}),
64+
},
65+
"useless failing subschemas (middle)": {
66+
"anyOf": Validator(
67+
{
68+
"anyOf": [
69+
*[False] * (NUM_USELESS // 2),
70+
subschema,
71+
*[False] * (NUM_USELESS // 2),
72+
],
73+
},
74+
),
75+
"oneOf": Validator(
76+
{
77+
"oneOf": [
78+
*[False] * (NUM_USELESS // 2),
79+
subschema,
80+
*[False] * (NUM_USELESS // 2),
81+
],
82+
},
83+
),
84+
},
85+
"useless failing subschemas (end)": {
86+
"anyOf": Validator({"anyOf": [*[False] * NUM_USELESS, subschema]}),
87+
"oneOf": Validator({"oneOf": [*[False] * NUM_USELESS, subschema]}),
88+
},
89+
}
90+
91+
if __name__ == "__main__":
92+
runner = Runner()
93+
94+
runner.bench_func("baseline valid", lambda: baseline.is_valid(valid))
95+
runner.bench_func("baseline invalid", lambda: baseline.is_valid(invalid))
96+
97+
for group, applicators in by_name.items():
98+
for applicator, validator in applicators.items():
99+
runner.bench_func(
100+
f"{group}: {applicator} valid",
101+
lambda validator=validator: validator.is_valid(valid),
102+
)
103+
runner.bench_func(
104+
f"{group}: {applicator} invalid",
105+
lambda validator=validator: validator.is_valid(invalid),
106+
)

0 commit comments

Comments
 (0)