Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Profile and optimize application performance including load times, memory usage, and rendering. Use when debugging slow performance, memory leaks, or optimizing app speed.
.claude/skills/onewave-ai-performance-profiler/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-08 | ✗→✓ | ▲ Improved | 141% | 0% |
| case-19 | ✗→✓ | ▲ Improved | 3% | 0% |
| case-04 | ✓→✓ | = Same ✓ | 102% | 0% |
| case-05 | ✓→✓ | = Same ✓ | 28% | 0% |
| case-06 | ✓→✓ | = Same ✓ | 48% | 0% |
When profiling performance:
bash# Lighthouse CLI npx lighthouse https://yoursite.com --view # With specific metrics npx lighthouse https://yoursite.com --only-categories=performance
Target Metrics: | Metric | Good | Needs Work | Poor | |--------|------|------------|------| | LCP (Largest Contentful Paint) | < 2.5s | 2.5-4s | > 4s | | INP (Interaction to Next Paint) | < 200ms | 200-500ms | > 500ms | | CLS (Cumulative Layout Shift) | < 0.1 | 0.1-0.25 | > 0.25 |
bash# Next.js ANALYZE=true npm run build # Webpack npx webpack-bundle-analyzer stats.json # Vite npx vite-bundle-visualizer
tsx// 1. Memoize expensive components const MemoizedList = React.memo(function List({ items }) { return items.map(item => <Item key={item.id} {...item} />); }); // 2. Use useMemo for expensive calculations const sortedItems = useMemo(() => { return [...items].sort((a, b) => a.name.localeCompare(b.name)); }, [items]); // 3. Use useCallback for stable function references const handleClick = useCallback((id: string) => { setSelected(id); }, []); // 4. Virtualize long lists import { FixedSizeList } from 'react-window'; function VirtualList({ items }) { return ( <FixedSizeList height={400} itemCount={items.length} itemSize={50} width="100%" > {({ index, style }) => ( <div style={style}>{items[index].name}</div> )} </FixedSizeList> ); } // 5. Lazy load components const HeavyComponent = React.lazy(() => import('./HeavyComponent')); function App() { return ( <Suspense fallback={<Loading />}> <HeavyComponent /> </Suspense> ); }
bash# CPU profile node --prof app.js node --prof-process isolate-*.log > profile.txt # Heap snapshot node --inspect app.js # Then use Chrome DevTools Memory tab # Clinic.js (comprehensive) npx clinic doctor -- node app.js npx clinic flame -- node app.js npx clinic bubbleprof -- node app.js
javascript// Add to app for debugging const used = process.memoryUsage(); console.log({ heapUsed: `${Math.round(used.heapUsed / 1024 / 1024)} MB`, heapTotal: `${Math.round(used.heapTotal / 1024 / 1024)} MB`, external: `${Math.round(used.external / 1024 / 1024)} MB`, });
sql-- PostgreSQL: Analyze slow queries EXPLAIN ANALYZE SELECT * FROM users WHERE email = 'test@example.com'; -- Find missing indexes SELECT relname, seq_scan, idx_scan FROM pg_stat_user_tables WHERE seq_scan > idx_scan;
typescript// Bad: N+1 query const users = await db.user.findMany(); for (const user of users) { const posts = await db.post.findMany({ where: { userId: user.id } }); } // Good: Single query with include const users = await db.user.findMany({ include: { posts: true } }); // Good: Select only needed fields const users = await db.user.findMany({ select: { id: true, name: true, email: true } });
loading="lazy")| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-03 | fail→fail | 18,696 | 15,355 | -18% | 1 | 1 | 0% | 3,533 | 4,371 | +24% | 0 | 0 | — |
case-01 | fail→fail | 20,639 | 41,614 | +102% | 1 | 1 | 0% | 4,100 | 4,123 | +1% | 0 | 0 | — |
case-02 | fail→fail | 15,888 | 14,582 | -8% | 1 | 1 | 0% | 3,531 | 4,379 | +24% | 0 | 0 | — |
case-04 | pass→pass | 4,844 | 3,071 | -37% | 1 | 1 | 0% | 818 | 1,655 | +102% | 0 | 0 | — |
case-05 | pass→pass | 8,386 | 3,522 | -58% | 1 | 1 | 0% | 1,424 | 1,826 | +28% | 0 | 0 | — |
case-06 | pass→pass | 6,216 | 2,824 | -55% | 1 | 1 | 0% | 1,091 | 1,620 | +48% | 0 | 0 | — |
case-07 | pass→pass | 4,334 | 2,632 | -39% | 1 | 1 | 0% | 776 | 1,598 | +106% | 0 | 0 | — |
case-08 | fail→pass | 4,948 | 3,969 | -20% | 1 | 1 | 0% | 768 | 1,851 | +141% | 0 | 0 | — |
case-09 | pass→pass | 7,963 | 4,908 | -38% | 1 | 1 | 0% | 1,545 | 2,075 | +34% | 0 | 0 | — |
case-10 | pass→pass | 2,457 | 2,135 | -13% | 1 | 1 | 0% | 431 | 1,578 | +266% | 0 | 0 | — |
case-11 | pass→pass | 2,254 | 1,909 | -15% | 1 | 1 | 0% | 444 | 1,540 | +247% | 0 | 0 | — |
case-12 | pass→pass | 3,810 | 2,810 | -26% | 1 | 1 | 0% | 701 | 1,630 | +133% | 0 | 0 | — |
case-13 | pass→pass | 3,300 | 3,157 | -4% | 1 | 1 | 0% | 656 | 1,770 | +170% | 0 | 0 | — |
case-14 | pass→pass | 7,376 | 6,306 | -15% | 1 | 1 | 0% | 1,453 | 2,550 | +75% | 0 | 0 | — |
case-15 | pass→pass | 2,673 | 1,799 | -33% | 1 | 1 | 0% | 437 | 1,458 | +234% | 0 | 0 | — |
case-16 | pass→pass | 7,416 | 6,453 | -13% | 1 | 1 | 0% | 1,494 | 2,552 | +71% | 0 | 0 | — |
case-17 | pass→pass | 3,126 | 2,680 | -14% | 1 | 1 | 0% | 522 | 1,668 | +220% | 0 | 0 | — |
case-18 | pass→pass | 1,731 | 1,883 | +9% | 1 | 1 | 0% | 239 | 1,513 | +533% | 0 | 0 | — |
case-19 | fail→pass | 13,412 | 7,583 | -43% | 1 | 1 | 0% | 2,442 | 2,517 | +3% | 0 | 0 | — |
case-20 | pass→pass | 1,963 | 2,175 | +11% | 1 | 1 | 0% | 271 | 1,523 | +462% | 0 | 0 | — |
case-21 | pass→pass | 6,096 | 4,588 | -25% | 1 | 1 | 0% | 1,323 | 1,916 | +45% | 0 | 0 | — |
case-22 | pass→pass | 8,171 | 6,234 | -24% | 1 | 1 | 0% | 1,898 | 2,535 | +34% | 0 | 0 | — |
case-23 | pass→pass | 7,419 | 6,235 | -16% | 1 | 1 | 0% | 1,525 | 2,453 | +61% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted. The headline lift of +9 percentage points is the difference between those two pass rates over the 23 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.