@fjell/registry 4.4.4 → 4.4.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/README.md +546 -0
  2. package/dist/Coordinate.cjs +8 -5
  3. package/dist/Coordinate.d.ts +1 -1
  4. package/dist/Coordinate.js +8 -5
  5. package/dist/Instance.cjs +4 -4
  6. package/dist/Instance.d.ts +3 -4
  7. package/dist/Instance.js +4 -4
  8. package/dist/Registry.cjs +99 -90
  9. package/dist/Registry.d.ts +3 -42
  10. package/dist/Registry.js +99 -90
  11. package/dist/RegistryHub.cjs +78 -0
  12. package/dist/RegistryHub.d.ts +3 -0
  13. package/dist/RegistryHub.js +74 -0
  14. package/dist/errors/CoordinateError.cjs +70 -0
  15. package/dist/errors/CoordinateError.d.ts +28 -0
  16. package/dist/errors/CoordinateError.js +63 -0
  17. package/dist/errors/InstanceError.cjs +101 -0
  18. package/dist/errors/InstanceError.d.ts +42 -0
  19. package/dist/errors/InstanceError.js +92 -0
  20. package/dist/errors/RegistryError.cjs +82 -0
  21. package/dist/errors/RegistryError.d.ts +31 -0
  22. package/dist/errors/RegistryError.js +75 -0
  23. package/dist/errors/RegistryHubError.cjs +92 -0
  24. package/dist/errors/RegistryHubError.d.ts +39 -0
  25. package/dist/errors/RegistryHubError.js +84 -0
  26. package/dist/errors/index.d.ts +4 -0
  27. package/dist/index.cjs +501 -112
  28. package/dist/index.cjs.map +1 -1
  29. package/dist/index.d.ts +3 -1
  30. package/dist/index.js +6 -2
  31. package/dist/types.d.ts +90 -0
  32. package/docs/TIMING_NODE_OPTIMIZATION.md +207 -0
  33. package/docs/TIMING_README.md +170 -0
  34. package/docs/memory-data/scaling-10-instances.json +526 -0
  35. package/docs/memory-data/scaling-100-instances.json +526 -0
  36. package/docs/memory-data/scaling-1000-instances.json +276 -0
  37. package/docs/memory-data/scaling-10000-instances.json +126 -0
  38. package/docs/memory-data/scaling-20-instances.json +526 -0
  39. package/docs/memory-data/scaling-200-instances.json +526 -0
  40. package/docs/memory-data/scaling-2000-instances.json +276 -0
  41. package/docs/memory-data/scaling-50-instances.json +526 -0
  42. package/docs/memory-data/scaling-500-instances.json +276 -0
  43. package/docs/memory-data/scaling-5000-instances.json +126 -0
  44. package/docs/memory-overhead.svg +120 -0
  45. package/docs/memory.md +430 -0
  46. package/docs/timing-range.svg +174 -0
  47. package/docs/timing.md +483 -0
  48. package/examples/README.md +187 -0
  49. package/examples/multi-level-keys.ts +374 -0
  50. package/examples/registry-hub-types.ts +437 -0
  51. package/examples/simple-example.ts +250 -0
  52. package/package.json +5 -3
  53. package/dist/Definition.cjs +0 -18
  54. package/dist/Definition.d.ts +0 -5
  55. package/dist/Definition.js +0 -14
@@ -0,0 +1,276 @@
1
+ {
2
+ "instanceCount": 500,
3
+ "iterations": 25,
4
+ "timestamp": "2025-07-19T19:08:19.514Z",
5
+ "measurements": [
6
+ {
7
+ "instanceCount": 500,
8
+ "memoryPerInstance": 1801.52,
9
+ "time": 12.186499999999967
10
+ },
11
+ {
12
+ "instanceCount": 500,
13
+ "memoryPerInstance": 1768.992,
14
+ "time": 8.972375
15
+ },
16
+ {
17
+ "instanceCount": 500,
18
+ "memoryPerInstance": 1692.768,
19
+ "time": 9.780334000000039
20
+ },
21
+ {
22
+ "instanceCount": 500,
23
+ "memoryPerInstance": 1693.072,
24
+ "time": 2.463041999999973
25
+ },
26
+ {
27
+ "instanceCount": 500,
28
+ "memoryPerInstance": 1692.8,
29
+ "time": 1.613584000000003
30
+ },
31
+ {
32
+ "instanceCount": 500,
33
+ "memoryPerInstance": 200,
34
+ "time": 26.012208999999984
35
+ },
36
+ {
37
+ "instanceCount": 500,
38
+ "memoryPerInstance": 4411.952,
39
+ "time": 1.849333999999999
40
+ },
41
+ {
42
+ "instanceCount": 500,
43
+ "memoryPerInstance": 1692.832,
44
+ "time": 1.223292000000015
45
+ },
46
+ {
47
+ "instanceCount": 500,
48
+ "memoryPerInstance": 1716.8,
49
+ "time": 0.47175000000004275
50
+ },
51
+ {
52
+ "instanceCount": 500,
53
+ "memoryPerInstance": 1692.672,
54
+ "time": 0.42520900000010897
55
+ },
56
+ {
57
+ "instanceCount": 500,
58
+ "memoryPerInstance": 1692.976,
59
+ "time": 0.4206249999999727
60
+ },
61
+ {
62
+ "instanceCount": 500,
63
+ "memoryPerInstance": 1712.848,
64
+ "time": 0.41800000000000637
65
+ },
66
+ {
67
+ "instanceCount": 500,
68
+ "memoryPerInstance": 7796.816,
69
+ "time": 0.8695000000000164
70
+ },
71
+ {
72
+ "instanceCount": 500,
73
+ "memoryPerInstance": 1692.928,
74
+ "time": 0.7204169999999976
75
+ },
76
+ {
77
+ "instanceCount": 500,
78
+ "memoryPerInstance": 1692.864,
79
+ "time": 0.6001670000000559
80
+ },
81
+ {
82
+ "instanceCount": 500,
83
+ "memoryPerInstance": 1693.024,
84
+ "time": 0.6088750000000118
85
+ },
86
+ {
87
+ "instanceCount": 500,
88
+ "memoryPerInstance": 1692.704,
89
+ "time": 0.8162500000000819
90
+ },
91
+ {
92
+ "instanceCount": 500,
93
+ "memoryPerInstance": 1692.928,
94
+ "time": 0.7249170000000049
95
+ },
96
+ {
97
+ "instanceCount": 500,
98
+ "memoryPerInstance": 1693.168,
99
+ "time": 0.4354170000000295
100
+ },
101
+ {
102
+ "instanceCount": 500,
103
+ "memoryPerInstance": 1692.656,
104
+ "time": 0.41829199999995126
105
+ },
106
+ {
107
+ "instanceCount": 500,
108
+ "memoryPerInstance": 1692.832,
109
+ "time": 0.4189999999999827
110
+ },
111
+ {
112
+ "instanceCount": 500,
113
+ "memoryPerInstance": 1692.704,
114
+ "time": 0.42512499999998
115
+ },
116
+ {
117
+ "instanceCount": 500,
118
+ "memoryPerInstance": 1693.072,
119
+ "time": 0.41275000000007367
120
+ },
121
+ {
122
+ "instanceCount": 500,
123
+ "memoryPerInstance": 1692.896,
124
+ "time": 0.7576669999999694
125
+ },
126
+ {
127
+ "instanceCount": 500,
128
+ "memoryPerInstance": 200,
129
+ "time": 10.74533400000007
130
+ }
131
+ ],
132
+ "stats": {
133
+ "instanceCount": 500,
134
+ "iterations": 25,
135
+ "memoryPerInstance": {
136
+ "min": 200,
137
+ "max": 7796.816,
138
+ "average": 1935.5129599999998,
139
+ "stdDev": 1380.6602295188625
140
+ },
141
+ "time": {
142
+ "min": 0.41275000000007367,
143
+ "max": 26.012208999999984,
144
+ "average": 3.3515986000000133,
145
+ "stdDev": 5.8478742359964375
146
+ },
147
+ "status": "PASS",
148
+ "measurements": [
149
+ {
150
+ "instanceCount": 500,
151
+ "memoryPerInstance": 1801.52,
152
+ "time": 12.186499999999967
153
+ },
154
+ {
155
+ "instanceCount": 500,
156
+ "memoryPerInstance": 1768.992,
157
+ "time": 8.972375
158
+ },
159
+ {
160
+ "instanceCount": 500,
161
+ "memoryPerInstance": 1692.768,
162
+ "time": 9.780334000000039
163
+ },
164
+ {
165
+ "instanceCount": 500,
166
+ "memoryPerInstance": 1693.072,
167
+ "time": 2.463041999999973
168
+ },
169
+ {
170
+ "instanceCount": 500,
171
+ "memoryPerInstance": 1692.8,
172
+ "time": 1.613584000000003
173
+ },
174
+ {
175
+ "instanceCount": 500,
176
+ "memoryPerInstance": 200,
177
+ "time": 26.012208999999984
178
+ },
179
+ {
180
+ "instanceCount": 500,
181
+ "memoryPerInstance": 4411.952,
182
+ "time": 1.849333999999999
183
+ },
184
+ {
185
+ "instanceCount": 500,
186
+ "memoryPerInstance": 1692.832,
187
+ "time": 1.223292000000015
188
+ },
189
+ {
190
+ "instanceCount": 500,
191
+ "memoryPerInstance": 1716.8,
192
+ "time": 0.47175000000004275
193
+ },
194
+ {
195
+ "instanceCount": 500,
196
+ "memoryPerInstance": 1692.672,
197
+ "time": 0.42520900000010897
198
+ },
199
+ {
200
+ "instanceCount": 500,
201
+ "memoryPerInstance": 1692.976,
202
+ "time": 0.4206249999999727
203
+ },
204
+ {
205
+ "instanceCount": 500,
206
+ "memoryPerInstance": 1712.848,
207
+ "time": 0.41800000000000637
208
+ },
209
+ {
210
+ "instanceCount": 500,
211
+ "memoryPerInstance": 7796.816,
212
+ "time": 0.8695000000000164
213
+ },
214
+ {
215
+ "instanceCount": 500,
216
+ "memoryPerInstance": 1692.928,
217
+ "time": 0.7204169999999976
218
+ },
219
+ {
220
+ "instanceCount": 500,
221
+ "memoryPerInstance": 1692.864,
222
+ "time": 0.6001670000000559
223
+ },
224
+ {
225
+ "instanceCount": 500,
226
+ "memoryPerInstance": 1693.024,
227
+ "time": 0.6088750000000118
228
+ },
229
+ {
230
+ "instanceCount": 500,
231
+ "memoryPerInstance": 1692.704,
232
+ "time": 0.8162500000000819
233
+ },
234
+ {
235
+ "instanceCount": 500,
236
+ "memoryPerInstance": 1692.928,
237
+ "time": 0.7249170000000049
238
+ },
239
+ {
240
+ "instanceCount": 500,
241
+ "memoryPerInstance": 1693.168,
242
+ "time": 0.4354170000000295
243
+ },
244
+ {
245
+ "instanceCount": 500,
246
+ "memoryPerInstance": 1692.656,
247
+ "time": 0.41829199999995126
248
+ },
249
+ {
250
+ "instanceCount": 500,
251
+ "memoryPerInstance": 1692.832,
252
+ "time": 0.4189999999999827
253
+ },
254
+ {
255
+ "instanceCount": 500,
256
+ "memoryPerInstance": 1692.704,
257
+ "time": 0.42512499999998
258
+ },
259
+ {
260
+ "instanceCount": 500,
261
+ "memoryPerInstance": 1693.072,
262
+ "time": 0.41275000000007367
263
+ },
264
+ {
265
+ "instanceCount": 500,
266
+ "memoryPerInstance": 1692.896,
267
+ "time": 0.7576669999999694
268
+ },
269
+ {
270
+ "instanceCount": 500,
271
+ "memoryPerInstance": 200,
272
+ "time": 10.74533400000007
273
+ }
274
+ ]
275
+ }
276
+ }
@@ -0,0 +1,126 @@
1
+ {
2
+ "instanceCount": 5000,
3
+ "iterations": 10,
4
+ "timestamp": "2025-07-19T19:08:19.852Z",
5
+ "measurements": [
6
+ {
7
+ "instanceCount": 5000,
8
+ "memoryPerInstance": 1735.912,
9
+ "time": 12.229791999999975
10
+ },
11
+ {
12
+ "instanceCount": 5000,
13
+ "memoryPerInstance": 3949.92,
14
+ "time": 24.691124999999943
15
+ },
16
+ {
17
+ "instanceCount": 5000,
18
+ "memoryPerInstance": 1438.8032,
19
+ "time": 14.020417000000066
20
+ },
21
+ {
22
+ "instanceCount": 5000,
23
+ "memoryPerInstance": 1259.1408,
24
+ "time": 16.681791999999973
25
+ },
26
+ {
27
+ "instanceCount": 5000,
28
+ "memoryPerInstance": 200,
29
+ "time": 23.48300000000006
30
+ },
31
+ {
32
+ "instanceCount": 5000,
33
+ "memoryPerInstance": 1697.7872,
34
+ "time": 4.912249999999972
35
+ },
36
+ {
37
+ "instanceCount": 5000,
38
+ "memoryPerInstance": 1035.2864,
39
+ "time": 9.176917000000003
40
+ },
41
+ {
42
+ "instanceCount": 5000,
43
+ "memoryPerInstance": 1561.4336,
44
+ "time": 8.707709000000023
45
+ },
46
+ {
47
+ "instanceCount": 5000,
48
+ "memoryPerInstance": 1115.1072,
49
+ "time": 8.549125000000004
50
+ },
51
+ {
52
+ "instanceCount": 5000,
53
+ "memoryPerInstance": 1455.2736,
54
+ "time": 9.410041999999976
55
+ }
56
+ ],
57
+ "stats": {
58
+ "instanceCount": 5000,
59
+ "iterations": 10,
60
+ "memoryPerInstance": {
61
+ "min": 200,
62
+ "max": 3949.92,
63
+ "average": 1544.8664000000003,
64
+ "stdDev": 905.4494052279144
65
+ },
66
+ "time": {
67
+ "min": 4.912249999999972,
68
+ "max": 24.691124999999943,
69
+ "average": 13.1862169,
70
+ "stdDev": 6.26552871990102
71
+ },
72
+ "status": "PASS",
73
+ "measurements": [
74
+ {
75
+ "instanceCount": 5000,
76
+ "memoryPerInstance": 1735.912,
77
+ "time": 12.229791999999975
78
+ },
79
+ {
80
+ "instanceCount": 5000,
81
+ "memoryPerInstance": 3949.92,
82
+ "time": 24.691124999999943
83
+ },
84
+ {
85
+ "instanceCount": 5000,
86
+ "memoryPerInstance": 1438.8032,
87
+ "time": 14.020417000000066
88
+ },
89
+ {
90
+ "instanceCount": 5000,
91
+ "memoryPerInstance": 1259.1408,
92
+ "time": 16.681791999999973
93
+ },
94
+ {
95
+ "instanceCount": 5000,
96
+ "memoryPerInstance": 200,
97
+ "time": 23.48300000000006
98
+ },
99
+ {
100
+ "instanceCount": 5000,
101
+ "memoryPerInstance": 1697.7872,
102
+ "time": 4.912249999999972
103
+ },
104
+ {
105
+ "instanceCount": 5000,
106
+ "memoryPerInstance": 1035.2864,
107
+ "time": 9.176917000000003
108
+ },
109
+ {
110
+ "instanceCount": 5000,
111
+ "memoryPerInstance": 1561.4336,
112
+ "time": 8.707709000000023
113
+ },
114
+ {
115
+ "instanceCount": 5000,
116
+ "memoryPerInstance": 1115.1072,
117
+ "time": 8.549125000000004
118
+ },
119
+ {
120
+ "instanceCount": 5000,
121
+ "memoryPerInstance": 1455.2736,
122
+ "time": 9.410041999999976
123
+ }
124
+ ]
125
+ }
126
+ }
@@ -0,0 +1,120 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg width="1200" height="800" xmlns="http://www.w3.org/2000/svg">
3
+ <style>
4
+ .axis { stroke: #333; stroke-width: 1; }
5
+ .grid { stroke: #ddd; stroke-width: 0.5; }
6
+ .label { font-family: Arial, sans-serif; font-size: 14px; fill: #333; }
7
+ .title { font-family: Arial, sans-serif; font-size: 16px; font-weight: bold; fill: #333; }
8
+ .subtitle { font-family: Arial, sans-serif; font-size: 12px; fill: #666; }
9
+ .per-instance { stroke: #3498db; stroke-width: 3; fill: none; }
10
+ .per-instance-dot { fill: #3498db; }
11
+ .legend { font-family: Arial, sans-serif; font-size: 12px; fill: #333; }
12
+ .axis-title { font-family: Arial, sans-serif; font-size: 16px; font-weight: bold; fill: #333; }
13
+ .metadata-section { font-family: Arial, sans-serif; font-size: 14px; font-weight: bold; fill: #444; }
14
+ .metadata-label { font-family: Arial, sans-serif; font-size: 10px; fill: #666; }
15
+ .metadata-value { font-family: Arial, sans-serif; font-size: 10px; fill: #333; }
16
+ </style>
17
+
18
+ <!-- Background -->
19
+ <rect width="1200" height="800" fill="white"/>
20
+
21
+ <!-- Title -->
22
+ <text x="600" y="25" text-anchor="middle" class="title">Memory Efficiency Per Instance</text>
23
+ <text x="600" y="45" text-anchor="middle" class="subtitle">Average memory overhead per registry instance across different scale sizes</text>
24
+
25
+ <!-- Plot area -->
26
+ <g transform="translate(110,60)">
27
+
28
+ <!-- Grid lines (Y-axis - memory in KB) -->
29
+ <line x1="0" y1="350.12472493372275" x2="990" y2="350.12472493372275" class="grid"/>
30
+ <text x="-10" y="354.12472493372275" text-anchor="end" class="label">2KB</text>
31
+ <line x1="0" y1="150.79051143084922" x2="990" y2="150.79051143084922" class="grid"/>
32
+ <text x="-10" y="154.79051143084922" text-anchor="end" class="label">5KB</text>
33
+ <line x1="0" y1="0" x2="990" y2="0" class="grid"/>
34
+ <text x="-10" y="4" text-anchor="end" class="label">10KB</text>
35
+ <line x1="0" y1="0" x2="0" y2="460" class="grid"/>
36
+ <text x="0" y="480" text-anchor="middle" class="label">10</text>
37
+ <line x1="99.33989856911381" y1="0" x2="99.33989856911381" y2="460" class="grid"/>
38
+ <text x="99.33989856911381" y="480" text-anchor="middle" class="label">20</text>
39
+ <line x1="230.6601014308862" y1="0" x2="230.6601014308862" y2="460" class="grid"/>
40
+ <text x="230.6601014308862" y="480" text-anchor="middle" class="label">50</text>
41
+ <line x1="330" y1="0" x2="330" y2="460" class="grid"/>
42
+ <text x="330" y="480" text-anchor="middle" class="label">100</text>
43
+ <line x1="429.3398985691138" y1="0" x2="429.3398985691138" y2="460" class="grid"/>
44
+ <text x="429.3398985691138" y="480" text-anchor="middle" class="label">200</text>
45
+ <line x1="560.6601014308862" y1="0" x2="560.6601014308862" y2="460" class="grid"/>
46
+ <text x="560.6601014308862" y="480" text-anchor="middle" class="label">500</text>
47
+ <line x1="660" y1="0" x2="660" y2="460" class="grid"/>
48
+ <text x="660" y="480" text-anchor="middle" class="label">1k</text>
49
+ <line x1="759.3398985691139" y1="0" x2="759.3398985691139" y2="460" class="grid"/>
50
+ <text x="759.3398985691139" y="480" text-anchor="middle" class="label">2k</text>
51
+ <line x1="890.6601014308862" y1="0" x2="890.6601014308862" y2="460" class="grid"/>
52
+ <text x="890.6601014308862" y="480" text-anchor="middle" class="label">5k</text>
53
+ <line x1="990" y1="0" x2="990" y2="460" class="grid"/>
54
+ <text x="990" y="480" text-anchor="middle" class="label">10k</text>
55
+ <!-- Y-axis -->
56
+ <line x1="0" y1="0" x2="0" y2="460" class="axis"/>
57
+
58
+ <!-- X-axis -->
59
+ <line x1="0" y1="460" x2="990" y2="460" class="axis"/>
60
+
61
+ <!-- Axis labels -->
62
+ <text x="495" y="510" text-anchor="middle" class="axis-title">Instance Count - Log Scale</text>
63
+ <text transform="rotate(-90,-70,230)" x="-70" y="230" text-anchor="middle" class="axis-title">Memory Usage (KB)</text>
64
+ <path d="M 0 214.73814943678775 L 99.33989856911381 294.1957220213991 L 230.6601014308862 318.7046587671789 L 330 333.16519783546573 L 429.3398985691138 321.20756970253024 L 560.6601014308862 362.414113545941 L 660 345.20990285866213 L 759.3398985691139 367.0226975001063 L 890.6601014308862 411.4562979279757 L 990 378.1877188461964" class="per-instance"/>
65
+ <circle cx="0" cy="214.73814943678775" r="4" class="per-instance-dot"/>
66
+ <circle cx="99.33989856911381" cy="294.1957220213991" r="4" class="per-instance-dot"/>
67
+ <circle cx="230.6601014308862" cy="318.7046587671789" r="4" class="per-instance-dot"/>
68
+ <circle cx="330" cy="333.16519783546573" r="4" class="per-instance-dot"/>
69
+ <circle cx="429.3398985691138" cy="321.20756970253024" r="4" class="per-instance-dot"/>
70
+ <circle cx="560.6601014308862" cy="362.414113545941" r="4" class="per-instance-dot"/>
71
+ <circle cx="660" cy="345.20990285866213" r="4" class="per-instance-dot"/>
72
+ <circle cx="759.3398985691139" cy="367.0226975001063" r="4" class="per-instance-dot"/>
73
+ <circle cx="890.6601014308862" cy="411.4562979279757" r="4" class="per-instance-dot"/>
74
+ <circle cx="990" cy="378.1877188461964" r="4" class="per-instance-dot"/>
75
+ <!-- Legend -->
76
+ <g transform="translate(20, 20)">
77
+ <rect x="0" y="0" width="190" height="60" fill="white" stroke="#ccc" stroke-width="1"/>
78
+
79
+ <!-- Memory Per Instance Legend -->
80
+ <text x="10" y="20" class="legend" font-weight="bold">Memory Per Instance</text>
81
+ <line x1="10" y1="30" x2="40" y2="30" class="per-instance"/>
82
+ <circle cx="25" cy="30" r="3" class="per-instance-dot"/>
83
+ <text x="45" y="34" class="legend">Average Performance</text>
84
+ </g>
85
+
86
+ </g>
87
+
88
+ <!-- Test Metadata Section - match timing chart layout exactly -->
89
+ <g transform="translate(50, 620)">
90
+ <!-- Left Column: System Information -->
91
+ <g transform="translate(20, 20)">
92
+ <text x="0" y="0" class="metadata-section">System Information</text>
93
+
94
+ <text x="0" y="25" class="metadata-label">Test Date:</text>
95
+ <text x="150" y="25" class="metadata-value">2025-07-19</text>
96
+
97
+ <text x="0" y="45" class="metadata-label">Package Version:</text>
98
+ <text x="150" y="45" class="metadata-value">@fjell/registry v4.4.5</text>
99
+
100
+ <text x="0" y="65" class="metadata-label">Node.js Version:</text>
101
+ <text x="150" y="65" class="metadata-value">v22.0.0 (darwin arm64)</text>
102
+
103
+ <text x="0" y="85" class="metadata-label">Platform:</text>
104
+ <text x="150" y="85" class="metadata-value">darwin arm64</text>
105
+
106
+ <text x="0" y="105" class="metadata-label">Compiler:</text>
107
+ <text x="150" y="105" class="metadata-value">TypeScript + Vite</text>
108
+ </g>
109
+
110
+ <!-- Right Column: Test Notes -->
111
+ <g transform="translate(400, 20)">
112
+ <text x="0" y="0" class="metadata-section">Test Notes</text>
113
+ <text x="0" y="25" class="metadata-label">• Memory measurements use Node.js process.memoryUsage() with heap precision</text>
114
+ <text x="0" y="42" class="metadata-label">• Each test includes garbage collection to minimize measurement variance</text>
115
+ <text x="0" y="59" class="metadata-label">• Logging is mocked during memory tests to eliminate overhead</text>
116
+ <text x="0" y="76" class="metadata-label">• Tests verify memory efficiency and consistency across instance counts</text>
117
+ <text x="0" y="93" class="metadata-label">• Statistical analysis ensures reliable performance measurements</text>
118
+ </g>
119
+ </g>
120
+ </svg>