owflow 0.5.0 → 0.7.0
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.
- package/LICENSE +21 -21
- package/README.md +448 -261
- package/dist/agents/bottleneck-analyzer.md +332 -329
- package/dist/agents/code-quality-pragmatist.md +353 -354
- package/dist/agents/code-reviewer.md +238 -239
- package/dist/agents/codebase-analysis-reporter.md +245 -246
- package/dist/agents/docs-operator.md +22 -23
- package/dist/agents/e2e-test-verifier.md +447 -448
- package/dist/agents/gap-analyzer.md +501 -502
- package/dist/agents/implementation-completeness-checker.md +219 -220
- package/dist/agents/implementation-planner.md +308 -309
- package/dist/agents/information-gatherer.md +690 -691
- package/dist/agents/production-readiness-checker.md +278 -279
- package/dist/agents/project-analyzer.md +403 -403
- package/dist/agents/reality-assessor.md +365 -366
- package/dist/agents/research-planner.md +449 -450
- package/dist/agents/research-synthesizer.md +402 -403
- package/dist/agents/solution-brainstormer.md +256 -257
- package/dist/agents/solution-designer.md +371 -372
- package/dist/agents/spec-auditor.md +297 -298
- package/dist/agents/specification-creator.md +333 -334
- package/dist/agents/task-classifier.md +449 -450
- package/dist/agents/task-group-implementer.md +283 -284
- package/dist/agents/test-suite-runner.md +194 -195
- package/dist/agents/user-docs-generator.md +508 -509
- package/dist/commands/reviews-code.md +90 -90
- package/dist/commands/reviews-pragmatic.md +99 -99
- package/dist/commands/reviews-production-readiness.md +113 -113
- package/dist/commands/reviews-reality-check.md +110 -110
- package/dist/commands/reviews-spec-audit.md +114 -114
- package/dist/commands/work.md +280 -280
- package/dist/configuration/agents-config.d.ts +2 -0
- package/dist/configuration/agents-config.js +8 -44
- package/dist/configuration/commands-config.d.ts +23 -0
- package/dist/configuration/commands-config.js +17 -17
- package/dist/configuration/skills-config.d.ts +2 -0
- package/dist/configuration/skills-config.js +3 -3
- package/dist/hooks/hooks-diagnostics.d.ts +3 -0
- package/dist/hooks/hooks-diagnostics.js +21 -0
- package/dist/hooks/hooks-persistence.d.ts +17 -0
- package/dist/hooks/hooks-persistence.js +207 -0
- package/dist/hooks/hooks-registry.d.ts +6 -0
- package/dist/hooks/hooks-registry.js +104 -0
- package/dist/hooks/hooks-wrapper.d.ts +25 -0
- package/dist/hooks/hooks-wrapper.js +318 -0
- package/dist/hooks/internal/before-tool.d.ts +6 -0
- package/dist/hooks/internal/before-tool.js +13 -0
- package/dist/hooks/internal/session-compaction.d.ts +9 -0
- package/dist/hooks/{session-compaction.js → internal/session-compaction.js} +9 -7
- package/dist/hooks/runtime/circuit-breaker.d.ts +23 -0
- package/dist/hooks/runtime/circuit-breaker.js +39 -0
- package/dist/hooks/runtime/failure-policy.d.ts +15 -0
- package/dist/hooks/runtime/failure-policy.js +49 -0
- package/dist/hooks/runtime/process-executor.d.ts +33 -0
- package/dist/hooks/runtime/process-executor.js +147 -0
- package/dist/hooks/runtime/status-recorder.d.ts +27 -0
- package/dist/hooks/runtime/status-recorder.js +111 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +111 -40
- package/dist/skills/agents-md-generator/SKILL.md +223 -223
- package/dist/skills/codebase-analyzer/SKILL.md +162 -162
- package/dist/skills/codebase-analyzer/references/code-analysis.md +63 -63
- package/dist/skills/codebase-analyzer/references/combined.md +31 -31
- package/dist/skills/codebase-analyzer/references/context-discovery.md +63 -63
- package/dist/skills/codebase-analyzer/references/file-discovery.md +51 -51
- package/dist/skills/codebase-analyzer/references/migration-target.md +23 -23
- package/dist/skills/codebase-analyzer/references/pattern-mining.md +22 -22
- package/dist/skills/dev-analyze/SKILL.md +115 -115
- package/dist/skills/dev-bugfix/SKILL.md +452 -452
- package/dist/skills/dev-finalize/SKILL.md +118 -118
- package/dist/skills/dev-implement/SKILL.md +167 -167
- package/dist/skills/dev-plan/SKILL.md +147 -147
- package/dist/skills/dev-spec/SKILL.md +182 -182
- package/dist/skills/dev-tdd-red/SKILL.md +94 -94
- package/dist/skills/dev-verify/SKILL.md +153 -153
- package/dist/skills/development/SKILL.md +260 -260
- package/dist/skills/diagrams-mermaid/SKILL.md +183 -159
- package/dist/skills/diagrams-mermaid/references/reference.md +220 -148
- package/dist/skills/docs-manager/SKILL.md +379 -379
- package/dist/skills/docs-manager/docs/INDEX.md +199 -199
- package/dist/skills/docs-manager/docs/standards/backend/api.md +25 -25
- package/dist/skills/docs-manager/docs/standards/backend/migrations.md +22 -22
- package/dist/skills/docs-manager/docs/standards/backend/models.md +25 -25
- package/dist/skills/docs-manager/docs/standards/backend/queries.md +22 -22
- package/dist/skills/docs-manager/docs/standards/frontend/accessibility.md +25 -25
- package/dist/skills/docs-manager/docs/standards/frontend/components.md +28 -28
- package/dist/skills/docs-manager/docs/standards/frontend/css.md +16 -16
- package/dist/skills/docs-manager/docs/standards/frontend/responsive.md +28 -28
- package/dist/skills/docs-manager/docs/standards/global/coding-style.md +25 -25
- package/dist/skills/docs-manager/docs/standards/global/commenting.md +10 -10
- package/dist/skills/docs-manager/docs/standards/global/conventions.md +31 -31
- package/dist/skills/docs-manager/docs/standards/global/error-handling.md +22 -22
- package/dist/skills/docs-manager/docs/standards/global/minimal-implementation.md +22 -22
- package/dist/skills/docs-manager/docs/standards/global/validation.md +28 -28
- package/dist/skills/docs-manager/docs/standards/testing/test-writing.md +25 -25
- package/dist/skills/docs-manager/references/agents-md-template.md +29 -29
- package/dist/skills/docs-manager/references/index-md-template.md +73 -73
- package/dist/skills/flow-init/SKILL.md +234 -234
- package/dist/skills/flow-init/references/architecture-template.md +45 -45
- package/dist/skills/flow-init/references/roadmap-templates.md +93 -93
- package/dist/skills/flow-init/references/tech-stack-template.md +70 -70
- package/dist/skills/flow-init/references/vision-templates.md +75 -75
- package/dist/skills/goal-development/SKILL.md +96 -96
- package/dist/skills/goal-migration/SKILL.md +114 -114
- package/dist/skills/goal-performance/SKILL.md +126 -0
- package/dist/skills/goal-research/SKILL.md +118 -118
- package/dist/skills/html-renderer/SKILL.md +173 -173
- package/dist/skills/html-renderer/references/index.html +318 -318
- package/dist/skills/html-renderer/references/styles.css +388 -388
- package/dist/skills/html-renderer/references/tokens.json +104 -104
- package/dist/skills/implementation-plan-executor/SKILL.md +378 -378
- package/dist/skills/implementation-verifier/SKILL.md +307 -307
- package/dist/skills/migration/SKILL.md +268 -268
- package/dist/skills/migration-analyze/SKILL.md +126 -126
- package/dist/skills/migration-finalize/SKILL.md +161 -161
- package/dist/skills/migration-fix/SKILL.md +155 -155
- package/dist/skills/migration-implement/SKILL.md +131 -131
- package/dist/skills/migration-plan/SKILL.md +131 -131
- package/dist/skills/migration-spec/SKILL.md +135 -135
- package/dist/skills/migration-spec/references/migration-strategies.md +430 -430
- package/dist/skills/migration-target/SKILL.md +134 -134
- package/dist/skills/migration-target/references/migration-types.md +489 -489
- package/dist/skills/migration-verify/SKILL.md +184 -184
- package/dist/skills/orchestrator-framework/SKILL.md +65 -65
- package/dist/skills/orchestrator-framework/references/command-namespacing.md +7 -7
- package/dist/skills/orchestrator-framework/references/confirm-or-revise-exception.md +20 -20
- package/dist/skills/orchestrator-framework/references/delegation-rules.md +54 -54
- package/dist/skills/orchestrator-framework/references/dispatcher-handoff.md +27 -27
- package/dist/skills/orchestrator-framework/references/fix-loop-contract.md +65 -65
- package/dist/skills/orchestrator-framework/references/gate-contract.md +122 -117
- package/dist/skills/orchestrator-framework/references/orchestrator-creation-checklist.md +51 -51
- package/dist/skills/orchestrator-framework/references/orchestrator-patterns.md +235 -235
- package/dist/skills/performance/SKILL.md +267 -437
- package/dist/skills/performance-analyze/SKILL.md +129 -0
- package/dist/skills/{performance → performance-analyze}/references/performance-optimization-guide.md +271 -365
- package/dist/skills/performance-finalize/SKILL.md +117 -0
- package/dist/skills/performance-implement/SKILL.md +114 -0
- package/dist/skills/performance-plan/SKILL.md +112 -0
- package/dist/skills/performance-spec/SKILL.md +145 -0
- package/dist/skills/performance-verify/SKILL.md +164 -0
- package/dist/skills/research/SKILL.md +249 -249
- package/dist/skills/research-brainstorm/SKILL.md +120 -120
- package/dist/skills/research-brainstorm/references/brainstorming-techniques.md +84 -84
- package/dist/skills/research-converge/SKILL.md +130 -130
- package/dist/skills/research-design/SKILL.md +146 -146
- package/dist/skills/research-design/references/design-techniques.md +40 -40
- package/dist/skills/research-finalize/SKILL.md +125 -125
- package/dist/skills/research-fork/SKILL.md +190 -190
- package/dist/skills/research-gather/SKILL.md +133 -133
- package/dist/skills/research-plan/SKILL.md +141 -141
- package/dist/skills/research-plan/references/research-methodologies.md +710 -710
- package/dist/skills/research-quick/SKILL.md +139 -139
- package/dist/skills/research-synthesize/SKILL.md +127 -127
- package/dist/skills/rule-reviewer/SKILL.md +334 -334
- package/dist/skills/standards-discover/SKILL.md +260 -260
- package/dist/skills/standards-discover/references/aggregation-strategy.md +76 -76
- package/dist/skills/standards-discover/references/code-pattern-prompt.md +68 -68
- package/dist/skills/standards-discover/references/config-analyzer-prompt.md +67 -67
- package/dist/skills/standards-discover/references/docs-extractor-prompt.md +65 -65
- package/dist/skills/standards-discover/references/external-analyzer-prompt.md +75 -75
- package/dist/skills/standards-update/SKILL.md +207 -207
- package/dist/templates/orchestrator-state-base.yml +17 -17
- package/dist/templates/orchestrator-state-development.yml +95 -95
- package/dist/templates/orchestrator-state-migration.yml +95 -95
- package/dist/templates/orchestrator-state-performance.yml +64 -53
- package/dist/templates/orchestrator-state-research.yml +67 -67
- package/dist/tools/fork_task.d.ts +17 -0
- package/dist/tools/fork_task.js +21 -11
- package/dist/tools/verify_template.d.ts +11 -0
- package/dist/tools/verify_template.js +32 -17
- package/dist/tui/hooks-dialogs.d.ts +20 -0
- package/dist/tui/hooks-dialogs.js +181 -0
- package/dist/tui/hooks-presenter.d.ts +15 -0
- package/dist/tui/hooks-presenter.js +70 -0
- package/dist/tui/hooks-sidebar.d.ts +10 -0
- package/dist/tui/hooks-sidebar.js +104 -0
- package/dist/tui/primitives.d.ts +21 -0
- package/dist/tui/primitives.js +47 -0
- package/dist/tui.d.ts +12 -0
- package/dist/tui.js +129 -0
- package/dist/types/hook-types.d.ts +125 -0
- package/dist/types/hook-types.js +76 -0
- package/dist/types/opencode-types.d.ts +13 -0
- package/dist/utils/file-util.d.ts +2 -0
- package/dist/utils/file-util.js +6 -6
- package/dist/utils/fork-task.d.ts +27 -0
- package/dist/utils/fork-task.js +18 -23
- package/dist/utils/plugin-info.d.ts +3 -0
- package/dist/utils/plugin-info.js +8 -10
- package/dist/utils/workflow-paths.d.ts +17 -0
- package/dist/utils/workflow-paths.js +18 -0
- package/dist/utils/yaml-structure.d.ts +7 -0
- package/dist/utils/yaml-structure.js +7 -11
- package/package.json +68 -48
- package/dist/hooks/before-tool.js +0 -19
package/dist/skills/{performance → performance-analyze}/references/performance-optimization-guide.md
RENAMED
|
@@ -1,365 +1,271 @@
|
|
|
1
|
-
# Performance Optimization Guide
|
|
2
|
-
|
|
3
|
-
Reference covering performance metrics knowledge
|
|
4
|
-
|
|
5
|
-
## Table of Contents
|
|
6
|
-
|
|
7
|
-
1. [Performance Metrics](#performance-metrics)
|
|
8
|
-
2. [Optimization Patterns](#optimization-patterns)
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
**
|
|
18
|
-
**
|
|
19
|
-
**
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
- p95
|
|
24
|
-
- p95
|
|
25
|
-
- p95
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
**
|
|
31
|
-
**
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
**
|
|
37
|
-
**
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
-
|
|
42
|
-
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
**Heap
|
|
48
|
-
**
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
**
|
|
56
|
-
**
|
|
57
|
-
**
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
for (let
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
if (n
|
|
156
|
-
|
|
157
|
-
memo[n]
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
stats
|
|
179
|
-
cache.
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
const
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
const
|
|
222
|
-
const
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
pool.
|
|
266
|
-
pool
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
# Static Analysis Detection Patterns
|
|
274
|
-
|
|
275
|
-
Strategies for detecting performance bottlenecks by reading code rather than running profiling tools.
|
|
276
|
-
|
|
277
|
-
## Database Pattern Detection
|
|
278
|
-
|
|
279
|
-
### N+1 Query Detection by Framework
|
|
280
|
-
|
|
281
|
-
**Generic ORM-in-loop patterns** (Grep heuristics):
|
|
282
|
-
- Query call inside `for`/`forEach`/`map`/`while` body
|
|
283
|
-
- `await` + model method inside iteration callback
|
|
284
|
-
- Lazy-loaded relationship access inside loop
|
|
285
|
-
|
|
286
|
-
**Framework-specific indicators**:
|
|
287
|
-
|
|
288
|
-
| Framework | N+1 Pattern | Fix Pattern |
|
|
289
|
-
|-----------|-------------|-------------|
|
|
290
|
-
| Sequelize | `.findByPk()`/`.findOne()` in loop | `include: [{ model: X }]` |
|
|
291
|
-
| Prisma | `prisma.x.findUnique()` in loop | `include: { x: true }` |
|
|
292
|
-
| TypeORM | `repository.findOne()` in loop | `relations: ['x']` or QueryBuilder `.leftJoinAndSelect()` |
|
|
293
|
-
| Django | Attribute access in template `{% for %}` | `.select_related()`/`.prefetch_related()` |
|
|
294
|
-
| Rails | Association call without `.includes()` | `.includes(:association)` |
|
|
295
|
-
| SQLAlchemy | Relationship access in loop | `joinedload()`/`subqueryload()` |
|
|
296
|
-
| Hibernate | `@ManyToOne` lazy access in loop | `@Fetch(FetchMode.JOIN)` or JPQL `JOIN FETCH` |
|
|
297
|
-
|
|
298
|
-
### Missing Index Detection
|
|
299
|
-
|
|
300
|
-
**Cross-reference strategy**:
|
|
301
|
-
1. Find all index definitions in schema/migration files
|
|
302
|
-
2. Find all query patterns (WHERE, ORDER BY, JOIN columns)
|
|
303
|
-
3. Flag columns queried but not indexed
|
|
304
|
-
|
|
305
|
-
**Where to find indexes by framework**:
|
|
306
|
-
- **Rails**: `add_index` in `db/migrate/` files
|
|
307
|
-
- **Django**: `db_index=True` in model fields, `indexes` in Meta
|
|
308
|
-
- **Sequelize**: `indexes` array in model definition
|
|
309
|
-
- **Prisma**: `@@index` and `@@unique` in schema.prisma
|
|
310
|
-
- **TypeORM**: `@Index()` decorator
|
|
311
|
-
- **SQL migrations**: `CREATE INDEX` statements
|
|
312
|
-
|
|
313
|
-
### Slow Query Pattern Indicators
|
|
314
|
-
|
|
315
|
-
Patterns detectable from code without running queries:
|
|
316
|
-
- `SELECT *` on tables with many columns
|
|
317
|
-
- Missing `LIMIT`/`TOP` on queries against known-large tables
|
|
318
|
-
- `LIKE '%...'` (leading wildcard prevents index use)
|
|
319
|
-
- `OR` conditions on different columns (prevents single index use)
|
|
320
|
-
- Subqueries in WHERE that could be JOINs
|
|
321
|
-
- `DISTINCT` masking a JOIN issue
|
|
322
|
-
|
|
323
|
-
## Algorithm Pattern Detection
|
|
324
|
-
|
|
325
|
-
### Nested Loop / O(n^2) Heuristics
|
|
326
|
-
|
|
327
|
-
**Search patterns**:
|
|
328
|
-
- Nested `for`/`forEach`/`while` loops over same or related collections
|
|
329
|
-
- `.find()`/`.filter()`/`.some()`/`.includes()` inside `.map()`/`.forEach()`/`for`
|
|
330
|
-
- `.indexOf()` inside loop (linear search repeated)
|
|
331
|
-
- `.sort()` inside loop (O(n log n) per iteration)
|
|
332
|
-
|
|
333
|
-
**Fix indicators**: Can be resolved by pre-building a Map/Set/index before the loop
|
|
334
|
-
|
|
335
|
-
### Blocking I/O Patterns
|
|
336
|
-
|
|
337
|
-
**Node.js sync operations**:
|
|
338
|
-
- `readFileSync`, `writeFileSync`, `readdirSync`, `statSync`, `existsSync`
|
|
339
|
-
- `execSync`, `spawnSync`
|
|
340
|
-
- `crypto.pbkdf2Sync`, `crypto.randomBytesSync`
|
|
341
|
-
|
|
342
|
-
**Sequential awaits** (should be `Promise.all`):
|
|
343
|
-
- Multiple `await` statements on independent operations in same function
|
|
344
|
-
- Sequential HTTP/fetch calls to different endpoints
|
|
345
|
-
- Sequential database queries with no data dependency between them
|
|
346
|
-
|
|
347
|
-
## Memory Pattern Detection
|
|
348
|
-
|
|
349
|
-
**Unbounded growth indicators**:
|
|
350
|
-
- `Map`/`Set`/`Object`/`Array` in module or class scope with `.set()`/`push()` but no `.delete()`/eviction
|
|
351
|
-
- No size limit check before adding to collection
|
|
352
|
-
- No TTL or expiration mechanism
|
|
353
|
-
|
|
354
|
-
**Leak-prone patterns**:
|
|
355
|
-
- `addEventListener`/`.on()` without paired `removeEventListener`/`.off()`
|
|
356
|
-
- `setInterval` without `clearInterval` in cleanup/destroy/unmount
|
|
357
|
-
- Closures in long-lived callbacks capturing large objects
|
|
358
|
-
|
|
359
|
-
## Caching Opportunity Detection
|
|
360
|
-
|
|
361
|
-
**Indicators**:
|
|
362
|
-
- Same query/function called multiple times with same parameters in a request lifecycle
|
|
363
|
-
- Database query in a loop that could be batched and cached
|
|
364
|
-
- External API call returning reference/config data (infrequent changes)
|
|
365
|
-
- Expensive computation (sort, aggregate, transform) on data that doesn't change per-request
|
|
1
|
+
# Performance Optimization Guide
|
|
2
|
+
|
|
3
|
+
Reference covering performance metrics knowledge and optimization patterns.
|
|
4
|
+
|
|
5
|
+
## Table of Contents
|
|
6
|
+
|
|
7
|
+
1. [Performance Metrics](#performance-metrics)
|
|
8
|
+
2. [Optimization Patterns](#optimization-patterns)
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Performance Metrics
|
|
13
|
+
|
|
14
|
+
## Response Time Metrics
|
|
15
|
+
|
|
16
|
+
**p50 (Median)**: 50% of requests faster than this value
|
|
17
|
+
**p95**: 95% of requests faster (typical SLA target)
|
|
18
|
+
**p99**: 99% of requests faster (worst-case for most users)
|
|
19
|
+
**Max**: Slowest request (often outlier, less important)
|
|
20
|
+
|
|
21
|
+
**Interpretation Thresholds**:
|
|
22
|
+
- p95 < 100ms: Excellent
|
|
23
|
+
- p95 100-500ms: Good
|
|
24
|
+
- p95 500-1000ms: Acceptable
|
|
25
|
+
- p95 > 1000ms: Slow (optimization needed)
|
|
26
|
+
|
|
27
|
+
## Throughput Metrics
|
|
28
|
+
|
|
29
|
+
**Requests/sec**: Total requests handled per second
|
|
30
|
+
**Transactions/sec**: Completed transactions per second
|
|
31
|
+
**Saturation Point**: Concurrency level where throughput plateaus
|
|
32
|
+
|
|
33
|
+
## CPU Metrics
|
|
34
|
+
|
|
35
|
+
**Usage %**: Overall CPU utilization
|
|
36
|
+
**Hot Functions**: Top functions by CPU time
|
|
37
|
+
**Complexity**: O(n), O(n log n), O(n^2), etc.
|
|
38
|
+
|
|
39
|
+
**Thresholds**:
|
|
40
|
+
- < 70%: Good headroom
|
|
41
|
+
- 70-90%: Acceptable
|
|
42
|
+
- \> 90%: Saturated
|
|
43
|
+
|
|
44
|
+
## Memory Metrics
|
|
45
|
+
|
|
46
|
+
**Heap Size**: Current memory usage
|
|
47
|
+
**Heap Growth**: Memory increase over time (leak indicator)
|
|
48
|
+
**GC Frequency**: Garbage collection frequency
|
|
49
|
+
|
|
50
|
+
**Leak Detection**: Heap grows continuously without plateau
|
|
51
|
+
|
|
52
|
+
## Database Metrics
|
|
53
|
+
|
|
54
|
+
**Queries/Request**: Total database queries per request
|
|
55
|
+
**Query Time**: Time spent in database
|
|
56
|
+
**N+1 Pattern**: 1 query + N related queries in loop
|
|
57
|
+
**Missing Indexes**: Full table scans
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
# Optimization Patterns
|
|
62
|
+
|
|
63
|
+
## Database Optimizations
|
|
64
|
+
|
|
65
|
+
### Fix N+1 Queries
|
|
66
|
+
|
|
67
|
+
**Problem**: 1 query to fetch list + N queries for related data
|
|
68
|
+
|
|
69
|
+
**Bad** (N+1 pattern):
|
|
70
|
+
```javascript
|
|
71
|
+
const users = await User.findAll(); // 1 query
|
|
72
|
+
for (let user of users) {
|
|
73
|
+
user.profile = await Profile.findByPk(user.id); // N queries
|
|
74
|
+
}
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
**Good** (eager loading):
|
|
78
|
+
```javascript
|
|
79
|
+
const users = await User.findAll({
|
|
80
|
+
include: [{ model: Profile }] // Single JOIN query
|
|
81
|
+
});
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### Add Missing Indexes
|
|
85
|
+
|
|
86
|
+
**Detection**: Query filters/sorts on unindexed columns
|
|
87
|
+
|
|
88
|
+
```sql
|
|
89
|
+
-- Before (slow - sequential scan)
|
|
90
|
+
SELECT * FROM orders WHERE user_id = 123;
|
|
91
|
+
|
|
92
|
+
-- Add index
|
|
93
|
+
CREATE INDEX CONCURRENTLY idx_orders_user_id ON orders(user_id);
|
|
94
|
+
|
|
95
|
+
-- After (fast - index scan)
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### Connection Pooling
|
|
99
|
+
|
|
100
|
+
```javascript
|
|
101
|
+
// Bad: New connection per query
|
|
102
|
+
const connection = await mysql.createConnection(config);
|
|
103
|
+
|
|
104
|
+
// Good: Connection pool
|
|
105
|
+
const pool = mysql.createPool({
|
|
106
|
+
connectionLimit: 10,
|
|
107
|
+
...config
|
|
108
|
+
});
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
## Algorithm Optimizations
|
|
112
|
+
|
|
113
|
+
### Replace O(n^2) with O(n)
|
|
114
|
+
|
|
115
|
+
**Bad** (nested loops):
|
|
116
|
+
```javascript
|
|
117
|
+
// O(n^2)
|
|
118
|
+
for (let user of users) {
|
|
119
|
+
for (let order of orders) {
|
|
120
|
+
if (order.userId === user.id) {
|
|
121
|
+
user.orders.push(order);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
**Good** (hash map):
|
|
128
|
+
```javascript
|
|
129
|
+
// O(n)
|
|
130
|
+
const ordersByUser = {};
|
|
131
|
+
for (let order of orders) {
|
|
132
|
+
if (!ordersByUser[order.userId]) ordersByUser[order.userId] = [];
|
|
133
|
+
ordersByUser[order.userId].push(order);
|
|
134
|
+
}
|
|
135
|
+
for (let user of users) {
|
|
136
|
+
user.orders = ordersByUser[user.id] || [];
|
|
137
|
+
}
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### Memoization
|
|
141
|
+
|
|
142
|
+
**Bad** (repeated calculations):
|
|
143
|
+
```javascript
|
|
144
|
+
function fibonacci(n) {
|
|
145
|
+
if (n <= 1) return n;
|
|
146
|
+
return fibonacci(n - 1) + fibonacci(n - 2); // Exponential time
|
|
147
|
+
}
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
**Good** (memoized):
|
|
151
|
+
```javascript
|
|
152
|
+
const memo = {};
|
|
153
|
+
function fibonacci(n) {
|
|
154
|
+
if (n <= 1) return n;
|
|
155
|
+
if (memo[n]) return memo[n];
|
|
156
|
+
memo[n] = fibonacci(n - 1) + fibonacci(n - 2);
|
|
157
|
+
return memo[n];
|
|
158
|
+
}
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
## Caching Strategies
|
|
162
|
+
|
|
163
|
+
### Cache Expensive Operations
|
|
164
|
+
|
|
165
|
+
```javascript
|
|
166
|
+
// Bad: Calculate every time
|
|
167
|
+
app.get('/stats', async (req, res) => {
|
|
168
|
+
const stats = await calculateExpensiveStats(); // 5 seconds
|
|
169
|
+
res.json(stats);
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
// Good: Cache results
|
|
173
|
+
const cache = new Map();
|
|
174
|
+
app.get('/stats', async (req, res) => {
|
|
175
|
+
let stats = cache.get('stats');
|
|
176
|
+
if (!stats) {
|
|
177
|
+
stats = await calculateExpensiveStats();
|
|
178
|
+
cache.set('stats', stats);
|
|
179
|
+
setTimeout(() => cache.delete('stats'), 60000); // TTL: 1 min
|
|
180
|
+
}
|
|
181
|
+
res.json(stats);
|
|
182
|
+
});
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
### Redis Caching
|
|
186
|
+
|
|
187
|
+
```javascript
|
|
188
|
+
const redis = require('redis');
|
|
189
|
+
const client = redis.createClient();
|
|
190
|
+
|
|
191
|
+
// Cache expensive query
|
|
192
|
+
async function getUser(id) {
|
|
193
|
+
const cached = await client.get(`user:${id}`);
|
|
194
|
+
if (cached) return JSON.parse(cached);
|
|
195
|
+
|
|
196
|
+
const user = await db.query('SELECT * FROM users WHERE id = ?', [id]);
|
|
197
|
+
await client.setex(`user:${id}`, 3600, JSON.stringify(user)); // TTL: 1 hour
|
|
198
|
+
return user;
|
|
199
|
+
}
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
## I/O Optimizations
|
|
203
|
+
|
|
204
|
+
### Async vs Sync
|
|
205
|
+
|
|
206
|
+
**Bad** (blocking):
|
|
207
|
+
```javascript
|
|
208
|
+
const data = fs.readFileSync('large-file.json'); // Blocks event loop
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
**Good** (non-blocking):
|
|
212
|
+
```javascript
|
|
213
|
+
const data = await fs.promises.readFile('large-file.json'); // Async
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
### Parallel API Calls
|
|
217
|
+
|
|
218
|
+
**Bad** (sequential):
|
|
219
|
+
```javascript
|
|
220
|
+
const user = await fetchUser(id); // 200ms
|
|
221
|
+
const orders = await fetchOrders(id); // 200ms
|
|
222
|
+
const profile = await fetchProfile(id); // 200ms
|
|
223
|
+
// Total: 600ms
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
**Good** (parallel):
|
|
227
|
+
```javascript
|
|
228
|
+
const [user, orders, profile] = await Promise.all([
|
|
229
|
+
fetchUser(id),
|
|
230
|
+
fetchOrders(id),
|
|
231
|
+
fetchProfile(id)
|
|
232
|
+
]);
|
|
233
|
+
// Total: 200ms (slowest of the three)
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
## Memory Optimizations
|
|
237
|
+
|
|
238
|
+
### Streaming Large Data
|
|
239
|
+
|
|
240
|
+
**Bad** (load all):
|
|
241
|
+
```javascript
|
|
242
|
+
const data = await fs.promises.readFile('large-file.csv'); // 1GB in memory
|
|
243
|
+
processCSV(data);
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
**Good** (stream):
|
|
247
|
+
```javascript
|
|
248
|
+
const stream = fs.createReadStream('large-file.csv');
|
|
249
|
+
stream.pipe(csvParser()).on('data', processRow); // Constant memory
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
### Object Pooling
|
|
253
|
+
|
|
254
|
+
```javascript
|
|
255
|
+
// Bad: Create new objects constantly
|
|
256
|
+
for (let i = 0; i < 1000000; i++) {
|
|
257
|
+
const obj = { x: i, y: i * 2 }; // 1M allocations
|
|
258
|
+
process(obj);
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
// Good: Reuse objects
|
|
262
|
+
const pool = { x: 0, y: 0 };
|
|
263
|
+
for (let i = 0; i < 1000000; i++) {
|
|
264
|
+
pool.x = i;
|
|
265
|
+
pool.y = i * 2; // 1 allocation, reused
|
|
266
|
+
process(pool);
|
|
267
|
+
}
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
---
|
|
271
|
+
|