关于 workers-performance
workers-performance 是面向 Cloudflare Workers 开发者的性能优化技能,提供 CPU、内存、缓存和包体积方面的实践建议,并附有参考资料、模板与脚本。
主要功能
- 01优化 CPU 使用与热点路径
- 02降低冷启动延迟
- 03通过流式处理减少内存占用
- 04使用缓存并批量处理操作
- 05缩减 Worker 包体积
- 06提供性能监控与基准测试资源
适用场景
- 01排查 Worker 的 CPU 超限
- 02降低首次请求延迟
- 03优化大型响应或数据集的处理
- 04为 Worker 添加缓存或性能计时
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ secondsky/ claude-skills --skill workers-performance安装后在 Claude Code 中输入/workers-performance确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/bundle-optimization.mdcaching-strategies.mdcold-starts.mdcpu-optimization.mdmemory-optimization.mdscripts/benchmark.shprofile-worker.shtemplates/caching-layer.tsoptimized-worker.tsperformance-middleware.ts详细介绍
Cloudflare Workers 性能优化
最大限度提升 Worker 性能并降低延迟的技巧。
快速见效
// 1. Avoid unnecessary cloning
// ❌ Bad: Clones entire request
const body = await request.clone().json();
// ✅ Good: Parse directly when not re-using body
const body = await request.json();
// 2. Use streaming instead of buffering
// ❌ Bad: Buffers entire response
const text = await response.text();
return new Response(transform(text));
// ✅ Good: Stream transformation
return new Response(response.body.pipeThrough(new TransformStream({
transform(chunk, controller) {
controller.enqueue(process(chunk));
}
})));
// 3. Cache expensive operations
const cache = caches.default;
const cached = await cache.match(request);
if (cached) return cached;
关键规则
- 控制在 CPU 限制以内 - 10ms(免费版)、30ms(付费版)、50ms(无绑定)
- 尽量减少冷启动 - 将包体积控制在 < 1MB,避免动态导入
- 使用 Cache API - 在边缘缓存响应
- 流式传输大型负载 - 不要缓冲整个响应
- 批量处理操作 - 合并多个 KV/D1 调用
十大性能错误
| 错误 | 症状 | 修复方法 |
|---|---|---|
| 超出 CPU 限制 | Worker 被终止 | 优化热点路径,使用流式处理 |
| 冷启动延迟 | 首个请求速度慢 | 缩小包体积,避免顶层 await |
| 内存压力 | GC 缓慢、超时 | 流式处理数据,避免使用大型数组 |
| KV 延迟 | 读取缓慢 | 使用 Cache API,批量读取 |
| D1 查询缓慢 | 延迟较高 | 添加索引,优化 SQL |
| 包体积过大 | 冷启动缓慢 | 使用 Tree Shaking,拆分代码 |
| 阻塞操作 | 请求超时 | 使用 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 操作
// For large JSON, use streaming parser
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;
}
内存优化
避免使用大型数组
// ❌ Bad: Loads all into memory
const items = await db.prepare('SELECT * FROM items').all();
const processed = items.results.map(transform);
// ✅ Good: Process in batches
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>;
}
// Layer 1: In-memory (request-scoped)
const memoryCache = new Map<string, unknown>();
// Layer 2: Cache API (edge-local)
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}` }
})
);
}
};
// Layer 3: KV (global)
// Use env.KV.get/put
包体积优化
// 1. Tree-shake imports
// ❌ Bad
import * as lodash from 'lodash';
// ✅ Good
import { debounce } from 'lodash-es';
// 2. Lazy load heavy dependencies
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 |
资源
评论
支持 Markdown