name: workers-performance
description: Cloudflare Workers性能优化,涉及CPU、内存、缓存、包大小。用于处理慢速workers、高延迟、冷启动、CPU限制、内存问题、超时错误。
Cloudflare Workers性能优化
最大化Worker性能并最小化延迟的技术。
快速获胜
// 1. 避免不必要的克隆
// ❌ 错误:克隆整个请求
const body = await request.clone().json();
// ✅ 良好:不重用body时直接解析
const body = await request.json();
// 2. 使用流式处理代替缓冲
// ❌ 错误:缓冲整个响应
const text = await response.text();
return new Response(transform(text));
// ✅ 良好:流式转换
return new Response(response.body.pipeThrough(new TransformStream({
transform(chunk, controller) {
controller.enqueue(process(chunk));
}
})));
// 3. 缓存昂贵操作
const cache = caches.default;
const cached = await cache.match(request);
if (cached) return cached;
关键规则
- 保持在CPU限制内 - 免费计划10毫秒,付费计划30毫秒,无限制计划50毫秒
- 最小化冷启动 - 保持包大小<1MB,避免动态导入
- 使用缓存API - 在边缘缓存响应
- 流式处理大负载 - 不要缓冲整个响应
- 批处理操作 - 合并多个KV/D1调用
十大性能错误
| 错误 |
症状 |
修复方法 |
| CPU限制超出 |
Worker被终止 |
优化热路径,使用流式处理 |
| 冷启动延迟 |
首次请求慢 |
减少包大小,避免顶层await |
| 内存压力 |
垃圾回收慢,超时 |
流式处理数据,避免大数组 |
| KV延迟 |
读取慢 |
使用缓存API,批量读取 |
| D1慢查询 |
高延迟 |
添加索引,优化SQL |
| 大包 |
冷启动慢 |
树摇,代码分割 |
| 阻塞操作 |
请求超时 |
使用Promise.all,流式处理 |
| 不必要克隆 |
内存峰值 |
仅在需要时克隆 |
| 缺少缓存 |
重复计算 |
实现缓存层 |
| 同步操作 |
CPU峰值 |
使用异步替代方案 |
CPU优化
分析热路径
async function profiledHandler(request: Request): Promise<Response> {
const timing: Record<string, number> = {};
const time = async <T>(name: string, fn: () => Promise<T>): Promise<T> => {
const start = Date.now();
const result = await fn();
timing[name] = Date.now() - start;
return result;
};
const data = await time('fetch', () => fetchData());
const processed = await time('process', () => processData(data));
const response = await time('serialize', () => serialize(processed));
console.log('Timing:', timing);
return new Response(response);
}
优化JSON操作
// 对于大JSON,使用流式解析器
import { JSONParser } from '@streamparser/json';
async function parseStreamingJSON(stream: ReadableStream): Promise<unknown[]> {
const parser = new JSONParser();
const results: unknown[] = [];
parser.onValue = (value) => results.push(value);
for await (const chunk of stream) {
parser.write(chunk);
}
return results;
}
内存优化
避免大数组
// ❌ 错误:全部加载到内存中
const items = await db.prepare('SELECT * FROM items').all();
const processed = items.results.map(transform);
// ✅ 良好:分批处理
async function* batchProcess(db: D1Database, batchSize = 100) {
let offset = 0;
while (true) {
const { results } = await db
.prepare('SELECT * FROM items LIMIT ? OFFSET ?')
.bind(batchSize, offset)
.all();
if (results.length === 0) break;
for (const item of results) {
yield transform(item);
}
offset += batchSize;
}
}
缓存策略
多层缓存
interface CacheLayer {
get(key: string): Promise<unknown | null>;
set(key: string, value: unknown, ttl?: number): Promise<void>;
}
// 第一层:内存缓存(请求范围内)
const memoryCache = new Map<string, unknown>();
// 第二层:缓存API(边缘本地)
const edgeCache: CacheLayer = {
async get(key) {
const response = await caches.default.match(new Request(`https://cache/${key}`));
return response ? response.json() : null;
},
async set(key, value, ttl = 60) {
await caches.default.put(
new Request(`https://cache/${key}`),
new Response(JSON.stringify(value), {
headers: { 'Cache-Control': `max-age=${ttl}` }
})
);
}
};
// 第三层:KV(全局)
// 使用env.KV.get/put
包优化
// 1. 树摇导入
// ❌ 错误
import * as lodash from 'lodash';
// ✅ 良好
import { debounce } from 'lodash-es';
// 2. 懒加载重依赖
let heavyLib: typeof import('heavy-lib') | undefined;
async function getHeavyLib() {
if (!heavyLib) {
heavyLib = await import('heavy-lib');
}
return heavyLib;
}
何时加载参考文档
根据任务加载特定参考文档:
- 优化CPU使用? → 加载
references/cpu-optimization.md
- 内存问题? → 加载
references/memory-optimization.md
- 实现缓存? → 加载
references/caching-strategies.md
- 减少包大小? → 加载
references/bundle-optimization.md
- 冷启动问题? → 加载
references/cold-starts.md
模板
| 模板 |
目的 |
使用时机 |
templates/performance-middleware.ts |
性能监控 |
添加计时/分析 |
templates/caching-layer.ts |
多层缓存 |
实现缓存 |
templates/optimized-worker.ts |
性能模式 |
启动优化worker |
脚本
| 脚本 |
目的 |
命令 |
scripts/benchmark.sh |
负载测试 |
./benchmark.sh <url> |
scripts/profile-worker.sh |
CPU分析 |
./profile-worker.sh |
资源