{"id":"b2dc192f-3dc9-4cd5-9490-b2617e35304d","shortId":"sc7WTq","kind":"skill","title":"performance-optimizer","tagline":"Identifies and fixes performance bottlenecks in code, databases, and APIs. Measures before and after to prove improvements.","description":"# Performance Optimizer\n\nFind and fix performance bottlenecks. Measure, optimize, verify. Make it fast.\n\n## When to Use This Skill\n\n- App is slow or laggy\n- User complains about performance\n- Page load times are high\n- API responses are slow\n- Database queries take too long\n- User mentions \"slow\", \"lag\", \"performance\", or \"optimize\"\n\n## The Optimization Process\n\n### 1. Measure First\n\nNever optimize without measuring:\n\n```javascript\n// Measure execution time\nconsole.time('operation');\nawait slowOperation();\nconsole.timeEnd('operation'); // operation: 2341ms\n```\n\n**What to measure:**\n- Page load time\n- API response time\n- Database query time\n- Function execution time\n- Memory usage\n- Network requests\n\n### 2. Find the Bottleneck\n\nUse profiling tools to find the slow parts:\n\n**Browser:**\n```\nDevTools → Performance tab → Record → Stop\nLook for long tasks (red bars)\n```\n\n**Node.js:**\n```bash\nnode --prof app.js\nnode --prof-process isolate-*.log > profile.txt\n```\n\n**Database:**\n```sql\nEXPLAIN ANALYZE SELECT * FROM users WHERE email = 'test@example.com';\n```\n\n### 3. Optimize\n\nFix the slowest thing first (biggest impact).\n\n## Common Optimizations\n\n### Database Queries\n\n**Problem: N+1 Queries**\n```javascript\n// Bad: N+1 queries\nconst users = await db.users.find();\nfor (const user of users) {\n  user.posts = await db.posts.find({ userId: user.id }); // N queries\n}\n\n// Good: Single query with JOIN\nconst users = await db.users.find()\n  .populate('posts'); // 1 query\n```\n\n**Problem: Missing Index**\n```sql\n-- Check slow query\nEXPLAIN SELECT * FROM users WHERE email = 'test@example.com';\n-- Shows: Seq Scan (bad)\n\n-- Add index\nCREATE INDEX idx_users_email ON users(email);\n\n-- Check again\nEXPLAIN SELECT * FROM users WHERE email = 'test@example.com';\n-- Shows: Index Scan (good)\n```\n\n**Problem: SELECT ***\n```javascript\n// Bad: Fetches all columns\nconst users = await db.query('SELECT * FROM users');\n\n// Good: Only needed columns\nconst users = await db.query('SELECT id, name, email FROM users');\n```\n\n**Problem: No Pagination**\n```javascript\n// Bad: Returns all records\nconst users = await db.users.find();\n\n// Good: Paginated\nconst users = await db.users.find()\n  .limit(20)\n  .skip((page - 1) * 20);\n```\n\n### API Performance\n\n**Problem: No Caching**\n```javascript\n// Bad: Hits database every time\napp.get('/api/stats', async (req, res) => {\n  const stats = await db.stats.calculate(); // Slow\n  res.json(stats);\n});\n\n// Good: Cache for 5 minutes\nconst cache = new Map();\napp.get('/api/stats', async (req, res) => {\n  const cached = cache.get('stats');\n  if (cached && Date.now() - cached.time < 300000) {\n    return res.json(cached.data);\n  }\n  \n  const stats = await db.stats.calculate();\n  cache.set('stats', { data: stats, time: Date.now() });\n  res.json(stats);\n});\n```\n\n**Problem: Sequential Operations**\n```javascript\n// Bad: Sequential (slow)\nconst user = await getUser(id);\nconst posts = await getPosts(id);\nconst comments = await getComments(id);\n// Total: 300ms + 200ms + 150ms = 650ms\n\n// Good: Parallel (fast)\nconst [user, posts, comments] = await Promise.all([\n  getUser(id),\n  getPosts(id),\n  getComments(id)\n]);\n// Total: max(300ms, 200ms, 150ms) = 300ms\n```\n\n**Problem: Large Payloads**\n```javascript\n// Bad: Returns everything\nres.json(users); // 5MB response\n\n// Good: Only needed fields\nres.json(users.map(u => ({\n  id: u.id,\n  name: u.name,\n  email: u.email\n}))); // 500KB response\n```\n\n### Frontend Performance\n\n**Problem: Unnecessary Re-renders**\n```javascript\n// Bad: Re-renders on every parent update\nfunction UserList({ users }) {\n  return users.map(user => <UserCard user={user} />);\n}\n\n// Good: Memoized\nconst UserCard = React.memo(({ user }) => {\n  return <div>{user.name}</div>;\n});\n```\n\n**Problem: Large Bundle**\n```javascript\n// Bad: Imports entire library\nimport _ from 'lodash'; // 70KB\n\n// Good: Import only what you need\nimport debounce from 'lodash/debounce'; // 2KB\n```\n\n**Problem: No Code Splitting**\n```javascript\n// Bad: Everything in one bundle\nimport HeavyComponent from './HeavyComponent';\n\n// Good: Lazy load\nconst HeavyComponent = React.lazy(() => import('./HeavyComponent'));\n```\n\n**Problem: Unoptimized Images**\n```html\n<!-- Bad: Large image -->\n<img src=\"photo.jpg\" /> <!-- 5MB -->\n\n<!-- Good: Optimized and responsive -->\n<img \n  src=\"photo-small.webp\" \n  srcset=\"photo-small.webp 400w, photo-large.webp 800w\"\n  loading=\"lazy\"\n  width=\"400\"\n  height=\"300\"\n/> <!-- 50KB -->\n```\n\n### Algorithm Optimization\n\n**Problem: Inefficient Algorithm**\n```javascript\n// Bad: O(n²) - nested loops\nfunction findDuplicates(arr) {\n  const duplicates = [];\n  for (let i = 0; i < arr.length; i++) {\n    for (let j = i + 1; j < arr.length; j++) {\n      if (arr[i] === arr[j]) duplicates.push(arr[i]);\n    }\n  }\n  return duplicates;\n}\n\n// Good: O(n) - single pass with Set\nfunction findDuplicates(arr) {\n  const seen = new Set();\n  const duplicates = new Set();\n  for (const item of arr) {\n    if (seen.has(item)) duplicates.add(item);\n    seen.add(item);\n  }\n  return Array.from(duplicates);\n}\n```\n\n**Problem: Repeated Calculations**\n```javascript\n// Bad: Calculates every time\nfunction getTotal(items) {\n  return items.reduce((sum, item) => sum + item.price * item.quantity, 0);\n}\n// Called 100 times in render\n\n// Good: Memoized\nconst getTotal = useMemo(() => {\n  return items.reduce((sum, item) => sum + item.price * item.quantity, 0);\n}, [items]);\n```\n\n### Memory Optimization\n\n**Problem: Memory Leak**\n```javascript\n// Bad: Event listener not cleaned up\nuseEffect(() => {\n  window.addEventListener('scroll', handleScroll);\n  // Memory leak!\n}, []);\n\n// Good: Cleanup\nuseEffect(() => {\n  window.addEventListener('scroll', handleScroll);\n  return () => window.removeEventListener('scroll', handleScroll);\n}, []);\n```\n\n**Problem: Large Data in Memory**\n```javascript\n// Bad: Loads entire file into memory\nconst data = fs.readFileSync('huge-file.txt'); // 1GB\n\n// Good: Stream it\nconst stream = fs.createReadStream('huge-file.txt');\nstream.on('data', chunk => process(chunk));\n```\n\n## Measuring Impact\n\nAlways measure before and after:\n\n```javascript\n// Before optimization\nconsole.time('query');\nconst users = await db.users.find();\nconsole.timeEnd('query');\n// query: 2341ms\n\n// After optimization (added index)\nconsole.time('query');\nconst users = await db.users.find();\nconsole.timeEnd('query');\n// query: 23ms\n\n// Improvement: 100x faster!\n```\n\n## Performance Budgets\n\nSet targets:\n\n```\nPage Load: < 2 seconds\nAPI Response: < 200ms\nDatabase Query: < 50ms\nBundle Size: < 200KB\nTime to Interactive: < 3 seconds\n```\n\n## Tools\n\n**Browser:**\n- Chrome DevTools Performance tab\n- Lighthouse (audit)\n- Network tab (waterfall)\n\n**Node.js:**\n- `node --prof` (profiling)\n- `clinic` (diagnostics)\n- `autocannon` (load testing)\n\n**Database:**\n- `EXPLAIN ANALYZE` (query plans)\n- Slow query log\n- Database profiler\n\n**Monitoring:**\n- New Relic\n- Datadog\n- Sentry Performance\n\n## Quick Wins\n\nEasy optimizations with big impact:\n\n1. **Add database indexes** on frequently queried columns\n2. **Enable gzip compression** on server\n3. **Add caching** for expensive operations\n4. **Lazy load** images and heavy components\n5. **Use CDN** for static assets\n6. **Minify and compress** JavaScript/CSS\n7. **Remove unused dependencies**\n8. **Use pagination** instead of loading all data\n9. **Optimize images** (WebP, proper sizing)\n10. **Enable HTTP/2** on server\n\n## Optimization Checklist\n\n- [ ] Measured current performance\n- [ ] Identified bottleneck\n- [ ] Applied optimization\n- [ ] Measured improvement\n- [ ] Verified functionality still works\n- [ ] No new bugs introduced\n- [ ] Documented the change\n\n## When NOT to Optimize\n\n- Premature optimization (optimize when it's actually slow)\n- Micro-optimizations (save 1ms when page takes 5 seconds)\n- Readable code is more important than tiny speed gains\n- If it's already fast enough\n\n## Key Principles\n\n- Measure before optimizing\n- Fix the biggest bottleneck first\n- Measure after to prove improvement\n- Don't sacrifice readability for tiny gains\n- Profile in production-like environment\n- Consider the 80/20 rule (20% of code causes 80% of slowness)\n\n## Related Skills\n\n- `@database-design` - Query optimization\n- `@codebase-audit-pre-push` - Code review\n- `@bug-hunter` - Debugging\n\n## Limitations\n- Use this skill only when the task clearly matches the scope described above.\n- Do not treat the output as a substitute for environment-specific validation, testing, or expert review.\n- Stop and ask for clarification if required inputs, permissions, safety boundaries, or success criteria are missing.","tags":["performance","optimizer","antigravity","awesome","skills","sickn33","agent-skills","agentic-skills","ai-agent-skills","ai-agents","ai-coding","ai-workflows"],"capabilities":["skill","source-sickn33","skill-performance-optimizer","topic-agent-skills","topic-agentic-skills","topic-ai-agent-skills","topic-ai-agents","topic-ai-coding","topic-ai-workflows","topic-antigravity","topic-antigravity-skills","topic-claude-code","topic-claude-code-skills","topic-codex-cli","topic-codex-skills"],"categories":["antigravity-awesome-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/sickn33/antigravity-awesome-skills/performance-optimizer","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add sickn33/antigravity-awesome-skills","source_repo":"https://github.com/sickn33/antigravity-awesome-skills","install_from":"skills.sh"}},"qualityScore":"0.700","qualityRationale":"deterministic score 0.70 from registry signals: · indexed on github topic:agent-skills · 34616 github stars · SKILL.md body (8,581 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-04-23T00:51:23.118Z","embedding":null,"createdAt":"2026-04-18T21:42:18.334Z","updatedAt":"2026-04-23T00:51:23.118Z","lastSeenAt":"2026-04-23T00:51:23.118Z","tsv":"'+1':171,176 '/api/stats':312,333 '/heavycomponent':504,512 '0':536,609,627 '1':72,205,298,544,788 '10':844 '100':611 '100x':721 '150ms':386,407 '1gb':673 '1ms':887 '2':110,729,796 '20':295,299,940 '200kb':739 '200ms':385,406,733 '2341ms':90,705 '23ms':719 '2kb':490 '3':156,743,802 '300000':345 '300ms':384,405,408 '4':808 '5':326,815,891 '500kb':433 '50ms':736 '5mb':418 '6':821 '650ms':387 '7':826 '70kb':479 '8':830 '80':944 '80/20':938 '9':838 'actual':881 'ad':708 'add':225,789,803 'algorithm':517,521 'alreadi':905 'alway':688 'analyz':149,767 'api':13,53,97,300,731 'app':39 'app.get':311,332 'app.js':138 'appli':856 'arr':530,549,551,554,567,580 'arr.length':538,546 'array.from':589 'ask':998 'asset':820 'async':313,334 'audit':752,956 'autocannon':762 'await':85,180,188,201,257,268,286,292,318,351,370,375,380,395,700,714 'bad':174,224,251,280,306,365,413,443,472,496,523,595,635,663 'bar':133 'bash':135 'big':786 'biggest':163,915 'bottleneck':8,27,113,855,916 'boundari':1006 'browser':122,746 'budget':724 'bug':866,962 'bug-hunt':961 'bundl':470,500,737 'cach':304,324,329,338,342,804 'cache.get':339 'cache.set':353 'cached.data':348 'cached.time':344 'calcul':593,596 'call':610 'caus':943 'cdn':817 'chang':870 'check':211,235 'checklist':850 'chrome':747 'chunk':683,685 'clarif':1000 'clean':639 'cleanup':648 'clear':973 'clinic':760 'code':10,493,894,942,959 'codebas':955 'codebase-audit-pre-push':954 'column':254,265,795 'comment':379,394 'common':165 'complain':45 'compon':814 'compress':799,824 'consid':936 'console.time':83,696,710 'console.timeend':87,702,716 'const':178,183,199,255,266,284,290,316,328,337,349,368,373,378,391,462,508,531,568,572,577,617,669,677,698,712 'creat':227 'criteria':1009 'current':852 'data':355,659,670,682,837 'databas':11,57,100,146,167,308,734,765,773,790,950 'database-design':949 'datadog':778 'date.now':343,358 'db.posts.find':189 'db.query':258,269 'db.stats.calculate':319,352 'db.users.find':181,202,287,293,701,715 'debounc':487 'debug':964 'depend':829 'describ':977 'design':951 'devtool':123,748 'diagnost':761 'document':868 'duplic':532,557,573,590 'duplicates.add':584 'duplicates.push':553 'easi':783 'email':154,219,231,234,242,273,431 'enabl':797,845 'enough':907 'entir':474,665 'environ':935,989 'environment-specif':988 'event':636 'everi':309,448,597 'everyth':415,497 'execut':81,104 'expens':806 'expert':994 'explain':148,214,237,766 'fast':33,390,906 'faster':722 'fetch':252 'field':423 'file':666 'find':23,111,118 'finddupl':529,566 'first':74,162,917 'fix':6,25,158,913 'frequent':793 'frontend':435 'fs.createreadstream':679 'fs.readfilesync':671 'function':103,451,528,565,599,861 'gain':901,929 'getcom':381,401 'getpost':376,399 'gettot':600,618 'getus':371,397 'good':194,247,262,288,323,388,420,460,480,505,558,615,647,674 'gzip':798 'handlescrol':644,652,656 'heavi':813 'heavycompon':502,509 'high':52 'hit':307 'html':516 'http/2':846 'huge-file.txt':672,680 'hunter':963 'id':271,372,377,382,398,400,402,427 'identifi':4,854 'idx':229 'imag':515,811,840 'impact':164,687,787 'import':473,476,481,486,501,511,897 'improv':20,720,859,922 'index':209,226,228,245,709,791 'ineffici':520 'input':1003 'instead':833 'interact':742 'introduc':867 'isol':143 'item':578,583,585,587,601,605,623,628 'item.price':607,625 'item.quantity':608,626 'items.reduce':603,621 'j':542,545,547,552 'javascript':79,173,250,279,305,364,412,442,471,495,522,594,634,662,693 'javascript/css':825 'join':198 'key':908 'lag':65 'laggi':43 'larg':410,469,658 'lazi':506,809 'leak':633,646 'let':534,541 'librari':475 'lighthous':751 'like':934 'limit':294,965 'listen':637 'load':49,95,507,664,728,763,810,835 'lodash':478 'lodash/debounce':489 'log':144,772 'long':61,130 'look':128 'loop':527 'make':31 'map':331 'match':974 'max':404 'measur':14,28,73,78,80,93,686,689,851,858,910,918 'memoiz':461,616 'memori':106,629,632,645,661,668 'mention':63 'micro':884 'micro-optim':883 'minifi':822 'minut':327 'miss':208,1011 'monitor':775 'n':170,175,192,525,560 'name':272,429 'need':264,422,485 'nest':526 'network':108,753 'never':75 'new':330,570,574,776,865 'node':136,139,757 'node.js':134,756 'o':524,559 'one':499 'oper':84,88,89,363,807 'optim':3,22,29,68,70,76,157,166,518,630,695,707,784,839,849,857,874,876,877,885,912,953 'output':983 'page':48,94,297,727,889 'pagin':278,289,832 'parallel':389 'parent':449 'part':121 'pass':562 'payload':411 'perform':2,7,21,26,47,66,124,301,436,723,749,780,853 'performance-optim':1 'permiss':1004 'plan':769 'popul':203 'post':204,374,393 'pre':957 'prematur':875 'principl':909 'problem':169,207,248,276,302,361,409,437,468,491,513,519,591,631,657 'process':71,142,684 'product':933 'production-lik':932 'prof':137,141,758 'prof-process':140 'profil':115,759,774,930 'profile.txt':145 'promise.all':396 'proper':842 'prove':19,921 'push':958 'queri':58,101,168,172,177,193,196,206,213,697,703,704,711,717,718,735,768,771,794,952 'quick':781 're':440,445 're-rend':439,444 'react.lazy':510 'react.memo':464 'readabl':893,926 'record':126,283 'red':132 'relat':947 'relic':777 'remov':827 'render':441,446,614 'repeat':592 'req':314,335 'request':109 'requir':1002 'res':315,336 'res.json':321,347,359,416,424 'respons':54,98,419,434,732 'return':281,346,414,454,466,556,588,602,620,653 'review':960,995 'rule':939 'sacrific':925 'safeti':1005 'save':886 'scan':223,246 'scope':976 'scroll':643,651,655 'second':730,744,892 'seen':569 'seen.add':586 'seen.has':582 'select':150,215,238,249,259,270 'sentri':779 'seq':222 'sequenti':362,366 'server':801,848 'set':564,571,575,725 'show':221,244 'singl':195,561 'size':738,843 'skill':38,948,968 'skill-performance-optimizer' 'skip':296 'slow':41,56,64,120,212,320,367,770,882,946 'slowest':160 'slowoper':86 'source-sickn33' 'specif':990 'speed':900 'split':494 'sql':147,210 'stat':317,322,340,350,354,356,360 'static':819 'still':862 'stop':127,996 'stream':675,678 'stream.on':681 'substitut':986 'success':1008 'sum':604,606,622,624 'tab':125,750,754 'take':59,890 'target':726 'task':131,972 'test':764,992 'test@example.com':155,220,243 'thing':161 'time':50,82,96,99,102,105,310,357,598,612,740 'tini':899,928 'tool':116,745 'topic-agent-skills' 'topic-agentic-skills' 'topic-ai-agent-skills' 'topic-ai-agents' 'topic-ai-coding' 'topic-ai-workflows' 'topic-antigravity' 'topic-antigravity-skills' 'topic-claude-code' 'topic-claude-code-skills' 'topic-codex-cli' 'topic-codex-skills' 'total':383,403 'treat':981 'u':426 'u.email':432 'u.id':428 'u.name':430 'unnecessari':438 'unoptim':514 'unus':828 'updat':450 'usag':107 'use':36,114,816,831,966 'useeffect':641,649 'usememo':619 'user':44,62,152,179,184,186,200,217,230,233,240,256,261,267,275,285,291,369,392,417,453,456,458,459,465,699,713 'user.id':191 'user.name':467 'user.posts':187 'usercard':457,463 'userid':190 'userlist':452 'users.map':425,455 'valid':991 'verifi':30,860 'waterfal':755 'webp':841 'win':782 'window.addeventlistener':642,650 'window.removeeventlistener':654 'without':77 'work':863","prices":[{"id":"f25bf146-90e2-4015-a340-16c01ce289d9","listingId":"b2dc192f-3dc9-4cd5-9490-b2617e35304d","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"sickn33","category":"antigravity-awesome-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T21:42:18.334Z"}],"sources":[{"listingId":"b2dc192f-3dc9-4cd5-9490-b2617e35304d","source":"github","sourceId":"sickn33/antigravity-awesome-skills/performance-optimizer","sourceUrl":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/performance-optimizer","isPrimary":false,"firstSeenAt":"2026-04-18T21:42:18.334Z","lastSeenAt":"2026-04-23T00:51:23.118Z"}],"details":{"listingId":"b2dc192f-3dc9-4cd5-9490-b2617e35304d","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"sickn33","slug":"performance-optimizer","github":{"repo":"sickn33/antigravity-awesome-skills","stars":34616,"topics":["agent-skills","agentic-skills","ai-agent-skills","ai-agents","ai-coding","ai-workflows","antigravity","antigravity-skills","claude-code","claude-code-skills","codex-cli","codex-skills","cursor","cursor-skills","developer-tools","gemini-cli","gemini-skills","kiro","mcp","skill-library"],"license":"mit","html_url":"https://github.com/sickn33/antigravity-awesome-skills","pushed_at":"2026-04-22T06:40:00Z","description":"Installable GitHub library of 1,400+ agentic skills for Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and more. Includes installer CLI, bundles, workflows, and official/community skill collections.","skill_md_sha":"d136b500b96dc83fcc7d7493c54b0b007fb2f855","skill_md_path":"skills/performance-optimizer/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/performance-optimizer"},"layout":"multi","source":"github","category":"antigravity-awesome-skills","frontmatter":{"name":"performance-optimizer","description":"Identifies and fixes performance bottlenecks in code, databases, and APIs. Measures before and after to prove improvements."},"skills_sh_url":"https://skills.sh/sickn33/antigravity-awesome-skills/performance-optimizer"},"updatedAt":"2026-04-23T00:51:23.118Z"}}