性能优化概述
Claude Code 可以帮助你进行系统性能分析和优化。
优化原则
先测量,再优化。不优化未经测量确认的代码。
优化流程
性能优化流程
├── 1. 性能分析 ──── 找出瓶颈
├── 2. 优化方案 ──── 制定方案
├── 3. 代码优化 ──── 实现优化
├── 4. 验证测试 ──── 确认效果
└── 5. 监控上线 ──── 持续监控
SQL 优化
1. 慢查询分析
bash
# Claude 分析慢查询
claude --optimize --sql
"""
分析以下慢查询并优化:
SELECT u.*, COUNT(p.id) as post_count
FROM users u
LEFT JOIN posts p ON u.id = p.user_id
WHERE u.is_active = 1
GROUP BY u.id
ORDER BY post_count DESC
LIMIT 100;
"""2. 优化输出
sql
-- 优化方案:
-- 1. 添加索引
CREATE INDEX idx_users_active ON users(is_active) WHERE is_active = 1;
CREATE INDEX idx_posts_user_id ON posts(user_id);
-- 2. 优化查询(避免全表分组)
SELECT u.id, u.username, u.email,
COALESCE(p.post_count, 0) as post_count
FROM users u
LEFT JOIN (
SELECT user_id, COUNT(*) as post_count
FROM posts
WHERE is_published = true
GROUP BY user_id
) p ON u.id = p.user_id
WHERE u.is_active = 1
ORDER BY post_count DESC
LIMIT 100;
-- 3. 使用窗口函数(如果数据库支持)
SELECT u.*,
COUNT(p.id) OVER (PARTITION BY u.id) as post_count
FROM users u
LEFT JOIN posts p ON u.id = p.user_id AND p.is_published = true
WHERE u.is_active = 1
LIMIT 100;3. N+1 查询问题
bash
# 解决 N+1 查询
claude --optimize --query
"""
优化以下代码的 N+1 查询问题:
# 原始代码
users = User.all
for user in users:
user.posts = Post.where(user_id: user.id).limit(5)
user.comment_count = Comment.where(user_id: user.id).count
"""sql
-- 优化方案:使用 JOIN 和子查询
-- 一次性查询获取所有数据
SELECT u.id, u.username,
p.posts_json,
c.comment_count
FROM users u
LEFT JOIN (
SELECT user_id,
JSON_ARRAYAGG(
JSON_OBJECT('id', id, 'title', title)
) as posts_json
FROM posts
WHERE is_published = true
GROUP BY user_id
) p ON u.id = p.user_id
LEFT JOIN (
SELECT user_id, COUNT(*) as comment_count
FROM comments
GROUP BY user_id
) c ON u.id = c.user_id
WHERE u.is_active = 1;缓存优化
1. Redis 缓存策略
bash
# 设计缓存策略
claude --optimize --cache
"""
为博客系统设计 Redis 缓存策略:
热点数据:
1. 文章详情(热门文章)
2. 用户信息
3. 文章列表(分页)
4. 分类列表
请给出:
1. 缓存 key 设计
2. TTL 设置
3. 缓存穿透/击穿/雪崩解决方案
"""2. 缓存实现
javascript
// 缓存服务
class CacheService {
constructor(redis) {
this.redis = redis;
}
// 设置缓存
async set(key, value, ttl = 3600) {
await this.redis.setex(key, ttl, JSON.stringify(value));
}
// 获取缓存
async get(key) {
const data = await this.redis.get(key);
return data ? JSON.parse(data) : null;
}
// 缓存穿透:空值缓存
async getOrSet(key, fetcher, ttl = 3600) {
const cached = await this.get(key);
if (cached !== null) return cached;
const value = await fetcher();
if (value === null) {
// 空值缓存,防止穿透
await this.set(key, 'EMPTY', 60);
} else {
await this.set(key, value, ttl);
}
return value;
}
// 缓存击穿:互斥锁
async getOrSetWithLock(key, fetcher, ttl = 3600) {
const cached = await this.get(key);
if (cached !== null) return cached;
const lockKey = `lock:${key}`;
const lock = await this.redis.set(lockKey, '1', 'NX', 'EX', 10);
if (lock) {
try {
const value = await fetcher();
await this.set(key, value, ttl);
return value;
} finally {
await this.redis.del(lockKey);
}
} else {
// 等待其他进程加载
await new Promise(r => setTimeout(r, 100));
return this.get(key);
}
}
}3. 多级缓存
javascript
// 多级缓存实现
class MultiLevelCache {
constructor() {
this.memory = new Map(); // L1: 内存
this.redis = redis; // L2: Redis
}
async get(key) {
// L1 查找
if (this.memory.has(key)) {
return this.memory.get(key);
}
// L2 查找
const redisValue = await this.redis.get(key);
if (redisValue) {
const value = JSON.parse(redisValue);
// 回填 L1
this.memory.set(key, value);
return value;
}
return null;
}
async set(key, value, memoryTTL = 60, redisTTL = 3600) {
// L1 缓存
this.memory.set(key, value);
setTimeout(() => this.memory.delete(key), memoryTTL * 1000);
// L2 缓存
await this.redis.setex(key, redisTTL, JSON.stringify(value));
}
}API 性能优化
1. 批量接口
bash
# 优化批量接口
claude --optimize --api
"""
优化以下批量查询接口:
当前实现:
GET /api/users?id=1
GET /api/users?id=2
GET /api/users?id=3
...
问题:N+1 请求
请设计批量接口。
"""typescript
// 优化后:批量查询接口
// 方案 1:批量查询参数
GET /api/users?ids=1,2,3,4,5
// 实现
router.get('/users', async (req, res) => {
const { ids } = req.query;
const userIds = ids.split(',').map(Number);
// 一次查询获取所有用户
const users = await User.whereIn('id', userIds).fetchAll();
// 按 ID 排序返回
const userMap = new Map(users.map(u => [u.id, u]));
const result = userIds.map(id => userMap.get(id)).filter(Boolean);
res.json({ data: result });
});
// 方案 2:GraphQL 批量查询
query {
users(ids: [1, 2, 3]) {
id
name
posts(limit: 5) {
id
title
}
}
}2. 数据压缩
typescript
// 响应压缩
import compression from 'compression';
app.use(compression({
filter: (req, res) => {
if (req.headers['x-no-compression']) return false;
return compression.filter(req, res);
},
level: 6, // 压缩级别 1-9
}));
// 分页压缩
function paginateResults(data, page, pageSize) {
const start = (page - 1) * pageSize;
const end = start + pageSize;
return {
data: data.slice(start, end),
pagination: {
page,
pageSize,
total: data.length,
totalPages: Math.ceil(data.length / pageSize),
}
};
}前端优化
1. 图片懒加载
typescript
// React 图片懒加载组件
function LazyImage({ src, alt, className }) {
const [loaded, setLoaded] = useState(false);
const [inView, setInView] = useState(false);
const ref = useRef();
useEffect(() => {
const observer = new IntersectionObserver(
([entry]) => {
if (entry.isIntersecting) {
setInView(true);
observer.disconnect();
}
},
{ rootMargin: '100px' }
);
if (ref.current) {
observer.observe(ref.current);
}
return () => observer.disconnect();
}, []);
return (
<div ref={ref} className={className}>
{inView && (
<img
src={src}
alt={alt}
onLoad={() => setLoaded(true)}
style={{
opacity: loaded ? 1 : 0,
transition: 'opacity 0.3s'
}}
/>
)}
</div>
);
}2. 代码分割
typescript
// React 路由懒加载
const Home = lazy(() => import('./pages/Home'));
const About = lazy(() => import('./pages/About'));
const Profile = lazy(() => import('./pages/Profile'));
function App() {
return (
<Router>
<Suspense fallback={<Loading />}>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
<Route path="/profile" element={<Profile />} />
</Routes>
</Suspense>
</Router>
);
}3. 预加载
html
<!-- 预加载关键资源 -->
<link rel="preload" href="main.css" as="style">
<link rel="preload" href="main.js" as="script">
<link rel="dns-prefetch" href="https://api.example.com">
<!-- 预加载关键图片 -->
<link rel="preload" href="hero-image.jpg" as="image">
<!-- 预获取 -->
<link rel="prefetch" href="next-page.html">监控与告警
1. 性能监控指标
typescript
// 性能监控中间件
function performanceMonitor(req, res, next) {
const start = process.hrtime.bigint();
res.on('finish', () => {
const end = process.hrtime.bigint();
const duration = Number(end - start) / 1e6; // ms
// 记录指标
metrics.record('http_request_duration', duration, {
method: req.method,
path: req.route?.path || req.path,
status: res.statusCode,
});
// 慢请求告警
if (duration > 1000) {
console.warn(`Slow request: ${req.method} ${req.path} took ${duration}ms`);
alerts.send('slow_request', {
method: req.method,
path: req.path,
duration,
timestamp: new Date(),
});
}
});
next();
}2. 关键指标
markdown
## 性能指标
| 指标 | 目标 | 告警阈值 |
|------|------|----------|
| API 响应时间 P99 | < 200ms | > 500ms |
| 数据库查询时间 | < 50ms | > 100ms |
| 页面加载时间 | < 2s | > 3s |
| 错误率 | < 0.1% | > 1% |
| CPU 使用率 | < 70% | > 85% |
| 内存使用率 | < 80% | > 90% |优化要点
性能优化的关键:测量 → 分析 → 优化 → 验证 → 监控
总结
Claude Code 性能优化要点:
- SQL 优化:索引、查询优化、N+1 问题
- 缓存优化:多级缓存、防穿透/击穿/雪崩
- API 优化:批量接口、数据压缩
- 前端优化:懒加载、代码分割、预加载
- 监控告警:关键指标、告警阈值、持续监控
性能优化是持续的工作,需要不断测量和改进。