答案
Whistle 提供了丰富的性能监控和分析功能,可以帮助开发者优化网络请求性能,提升用户体验。
性能监控指标
1. 请求时间分析
Whistle 会记录每个请求的详细时间信息:
- DNS 解析时间:域名解析到 IP 地址的时间
- TCP 连接时间:建立 TCP 连接的时间
- SSL/TLS 握手时间:HTTPS 连接建立的时间
- 请求发送时间:发送请求数据的时间
- 等待时间(TTFB):服务器响应前的等待时间
- 内容下载时间:接收响应数据的时间
- 总请求时间:从开始到结束的总时间
2. 请求大小统计
- 请求大小:发送的请求数据大小
- 响应大小:接收的响应数据大小
- 压缩后大小:经过 gzip 等压缩后的数据大小
- 压缩率:压缩前后的比例
3. 状态码统计
- 2xx 成功:成功的请求
- 3xx 重定向:重定向请求
- 4xx 客户端错误:客户端错误
- 5xx 服务器错误:服务器错误
性能分析功能
1. 请求瀑布图
Whistle 提供可视化的请求瀑布图,可以:
- 查看请求的并行和串行关系
- 识别性能瓶颈
- 分析资源加载顺序
- 发现阻塞请求
2. 性能报告
生成详细的性能报告,包括:
- 总请求数
- 总数据量
- 平均请求时间
- 最慢的请求列表
- 最大的资源列表
- 性能评分
3. 对比分析
可以对比不同时间段的性能数据:
- 历史性能对比
- 不同环境性能对比
- 优化前后对比
性能优化建议
1. 减少请求数量
问题: 请求过多导致加载时间过长
解决方案:
- 合并多个小文件
- 使用雪碧图合并图片
- 使用内联资源
- 使用 HTTP/2 多路复用
Whistle 配置示例:
shell# 合并多个 CSS 文件 style1.css resBody://{combined-styles.css} style2.css resBody://{combined-styles.css}
2. 启用压缩
问题: 资源文件过大
解决方案:
- 启用 gzip 压缩
- 使用 Brotli 压缩
- 优化图片格式
Whistle 配置示例:
shellwww.example.com resHeaders://{compression-headers.json}
compression-headers.json:
json{ "Content-Encoding": "gzip" }
3. 优化缓存策略
问题: 重复请求相同资源
解决方案:
- 设置合适的缓存头
- 使用 ETag
- 使用 Last-Modified
- 实现本地存储
Whistle 配置示例:
shellwww.example.com/static/* resHeaders://{cache-headers.json}
cache-headers.json:
json{ "Cache-Control": "max-age=31536000", "Expires": "Wed, 21 Oct 2025 07:28:00 GMT" }
4. 减少 DNS 查询
问题: 多个域名导致多次 DNS 查询
解决方案:
- 减少域名数量
- 使用 DNS 预解析
- 使用 CDN
Whistle 配置示例:
shell# DNS 预解析 www.example.com reqHeaders://{dns-prefetch.json}
5. 优化图片加载
问题: 图片文件过大或加载顺序不合理
解决方案:
- 使用 WebP 格式
- 实现懒加载
- 使用响应式图片
- 优化图片质量
Whistle 配置示例:
shell*.jpg resBody://{optimized-image.jpg} *.png resBody://{optimized-image.png}
性能监控实践
1. 建立性能基准
- 记录初始性能数据
- 设定性能目标
- 定期进行性能测试
2. 持续监控
- 设置性能告警
- 定期生成性能报告
- 跟踪性能趋势
3. 问题定位
使用 whistle 定位性能问题:
-
查看慢请求
- 按请求时间排序
- 分析慢请求的原因
- 优化慢请求
-
分析大文件
- 按响应大小排序
- 优化大文件
- 考虑分片加载
-
检查错误请求
- 查看 4xx 和 5xx 错误
- 修复错误请求
- 优化错误处理
高级性能分析
1. 使用 resScript 分析
javascriptmodule.exports = function(req, res) { const startTime = Date.now(); const originalEnd = res.end; res.end = function(chunk, encoding) { const endTime = Date.now(); const duration = endTime - startTime; console.log(`Request ${req.url} took ${duration}ms`); console.log(`Response size: ${chunk ? chunk.length : 0} bytes`); originalEnd.call(res, chunk, encoding); }; };
2. 性能数据导出
Whistle 支持导出性能数据:
- 导出为 CSV 格式
- 导出为 JSON 格式
- 导出为 HAR 格式
3. 集成性能监控工具
- 集成 Google Lighthouse
- 集成 WebPageTest
- 集成自定义监控系统
最佳实践
-
定期性能测试
- 建立性能测试流程
- 使用自动化测试工具
- 记录测试结果
-
性能目标设定
- 设定合理的性能目标
- 分阶段优化
- 持续改进
-
团队协作
- 分享性能数据
- 建立性能规范
- 定期性能评审
-
文档记录
- 记录优化过程
- 总结优化经验
- 建立知识库