🌐 US-Proxy
class="logged-out env-production page-responsive" style="word-wrap: break-word;" >
Skip to content

Commit 035f580

Browse files
SanderMullerclaude
authored andcommitted
Add benchmark reproducing the deep BooleanOr resolveType() slowdown
or-chain-resolve-type-blowup.php is a 100-arm instanceof || chain that takes the recursive resolveType() path without the flattening fix (about 8.5s here) and the flattened path with it (about 1.3s). It sits alongside the existing and-chain-truthy-blowup.php and or-chain-falsey-blowup.php benches, covering the resolveType path at the default BOOLEAN_EXPRESSION_MAX_PROCESS_DEPTH. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent 45796ee commit 035f580

1 file changed

Lines changed: 117 additions & 0 deletions

File tree

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
<?php declare(strict_types = 1);
2+
3+
namespace BenchOrChainResolveTypeBlowup;
4+
5+
/**
6+
* Regression test for O(N^2) in deep BooleanOr chains resolved via BooleanOrHandler::resolveType().
7+
* Without the flattening, resolving the boolean type of the chain recursed into the left operand
8+
* and re-narrowed the whole left chain with filterByFalseyValue() at each level, creating O(N^2)
9+
* scope operations. Uses instanceof arms so the per-level narrowing is expensive enough to show
10+
* at the BOOLEAN_EXPRESSION_MAX_PROCESS_DEPTH = 4 default (no raised cap needed).
11+
*/
12+
final class C1 {}
13+
final class C2 {}
14+
final class C3 {}
15+
final class C4 {}
16+
final class C5 {}
17+
final class C6 {}
18+
final class C7 {}
19+
final class C8 {}
20+
final class C9 {}
21+
final class C10 {}
22+
final class C11 {}
23+
final class C12 {}
24+
final class C13 {}
25+
final class C14 {}
26+
final class C15 {}
27+
final class C16 {}
28+
final class C17 {}
29+
final class C18 {}
30+
final class C19 {}
31+
final class C20 {}
32+
final class C21 {}
33+
final class C22 {}
34+
final class C23 {}
35+
final class C24 {}
36+
final class C25 {}
37+
final class C26 {}
38+
final class C27 {}
39+
final class C28 {}
40+
final class C29 {}
41+
final class C30 {}
42+
final class C31 {}
43+
final class C32 {}
44+
final class C33 {}
45+
final class C34 {}
46+
final class C35 {}
47+
final class C36 {}
48+
final class C37 {}
49+
final class C38 {}
50+
final class C39 {}
51+
final class C40 {}
52+
final class C41 {}
53+
final class C42 {}
54+
final class C43 {}
55+
final class C44 {}
56+
final class C45 {}
57+
final class C46 {}
58+
final class C47 {}
59+
final class C48 {}
60+
final class C49 {}
61+
final class C50 {}
62+
final class C51 {}
63+
final class C52 {}
64+
final class C53 {}
65+
final class C54 {}
66+
final class C55 {}
67+
final class C56 {}
68+
final class C57 {}
69+
final class C58 {}
70+
final class C59 {}
71+
final class C60 {}
72+
final class C61 {}
73+
final class C62 {}
74+
final class C63 {}
75+
final class C64 {}
76+
final class C65 {}
77+
final class C66 {}
78+
final class C67 {}
79+
final class C68 {}
80+
final class C69 {}
81+
final class C70 {}
82+
final class C71 {}
83+
final class C72 {}
84+
final class C73 {}
85+
final class C74 {}
86+
final class C75 {}
87+
final class C76 {}
88+
final class C77 {}
89+
final class C78 {}
90+
final class C79 {}
91+
final class C80 {}
92+
final class C81 {}
93+
final class C82 {}
94+
final class C83 {}
95+
final class C84 {}
96+
final class C85 {}
97+
final class C86 {}
98+
final class C87 {}
99+
final class C88 {}
100+
final class C89 {}
101+
final class C90 {}
102+
final class C91 {}
103+
final class C92 {}
104+
final class C93 {}
105+
final class C94 {}
106+
final class C95 {}
107+
final class C96 {}
108+
final class C97 {}
109+
final class C98 {}
110+
final class C99 {}
111+
final class C100 {}
112+
113+
function test(object $x): void {
114+
if ($x instanceof C1 || $x instanceof C2 || $x instanceof C3 || $x instanceof C4 || $x instanceof C5 || $x instanceof C6 || $x instanceof C7 || $x instanceof C8 || $x instanceof C9 || $x instanceof C10 || $x instanceof C11 || $x instanceof C12 || $x instanceof C13 || $x instanceof C14 || $x instanceof C15 || $x instanceof C16 || $x instanceof C17 || $x instanceof C18 || $x instanceof C19 || $x instanceof C20 || $x instanceof C21 || $x instanceof C22 || $x instanceof C23 || $x instanceof C24 || $x instanceof C25 || $x instanceof C26 || $x instanceof C27 || $x instanceof C28 || $x instanceof C29 || $x instanceof C30 || $x instanceof C31 || $x instanceof C32 || $x instanceof C33 || $x instanceof C34 || $x instanceof C35 || $x instanceof C36 || $x instanceof C37 || $x instanceof C38 || $x instanceof C39 || $x instanceof C40 || $x instanceof C41 || $x instanceof C42 || $x instanceof C43 || $x instanceof C44 || $x instanceof C45 || $x instanceof C46 || $x instanceof C47 || $x instanceof C48 || $x instanceof C49 || $x instanceof C50 || $x instanceof C51 || $x instanceof C52 || $x instanceof C53 || $x instanceof C54 || $x instanceof C55 || $x instanceof C56 || $x instanceof C57 || $x instanceof C58 || $x instanceof C59 || $x instanceof C60 || $x instanceof C61 || $x instanceof C62 || $x instanceof C63 || $x instanceof C64 || $x instanceof C65 || $x instanceof C66 || $x instanceof C67 || $x instanceof C68 || $x instanceof C69 || $x instanceof C70 || $x instanceof C71 || $x instanceof C72 || $x instanceof C73 || $x instanceof C74 || $x instanceof C75 || $x instanceof C76 || $x instanceof C77 || $x instanceof C78 || $x instanceof C79 || $x instanceof C80 || $x instanceof C81 || $x instanceof C82 || $x instanceof C83 || $x instanceof C84 || $x instanceof C85 || $x instanceof C86 || $x instanceof C87 || $x instanceof C88 || $x instanceof C89 || $x instanceof C90 || $x instanceof C91 || $x instanceof C92 || $x instanceof C93 || $x instanceof C94 || $x instanceof C95 || $x instanceof C96 || $x instanceof C97 || $x instanceof C98 || $x instanceof C99 || $x instanceof C100) {
115+
echo "yes";
116+
}
117+
}

0 commit comments

Comments
 (0)