owflow 0.6.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 -283
- package/dist/agents/bottleneck-analyzer.md +332 -333
- 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 -126
- 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 -122
- 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 -267
- package/dist/skills/performance-analyze/SKILL.md +129 -129
- package/dist/skills/performance-analyze/references/performance-optimization-guide.md +271 -271
- package/dist/skills/performance-finalize/SKILL.md +117 -117
- package/dist/skills/performance-implement/SKILL.md +114 -114
- package/dist/skills/performance-plan/SKILL.md +112 -112
- package/dist/skills/performance-spec/SKILL.md +145 -145
- package/dist/skills/performance-verify/SKILL.md +164 -164
- 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 -64
- 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
|
@@ -1,271 +1,271 @@
|
|
|
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
|
-
|
|
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
|
+
|