前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
返回 AI 情报前线
All News · 全部资讯9275
  • AI编程助手Lovable完成新一轮4亿美元融资,估值达133亿美元
  • MiniMax Music 3.0:开放权重生产级音乐生成模型
  • Microsoft 发布 MindTopo:VLMs 空间推理能力新基准
  • Grok 4.6 发布:剑指 GPT-5.6 Sol,主打长时间 Agent 任务
  • Grok 4.6 中文详解:训练数据、Agent 能力边界与定价
  • 市场份额报告:Google Gemini 份额从 12% 跌至 1.9%
  • 用Embeddings+Reranking+LLM构建可靠的内容分类流水线
  • 推理冷启动从10分钟降至秒级:容器镜像瘦身实战
  • Anthropic研究揭示:Claude Code旧版权限提示97%被机械通过
  • DeepSeek-V4-Pro-0813 悄然上线,支持思考与非思考模式
  • AI 生图 Prompt 审核实战:Node.js 调用 Chat JSON Schema 方案
  • 企业AI分析的隐藏陷阱:语义漂移问题深度剖析
  • AI 正在消除软件工程中层:代码看不懂、没人负责的团队困境
  • Qwen3.8-2.4T-A95B 模型发布
  • TraceMotive:本地优先的AI代理执行追踪调试工具
  • AI编程工具正在离开IDE:终端原生Agent工作流崛起
  • 个人开发者用AI编程的项目架构经验
  • FastAPI五个安全漏洞发现与修复全过程
  • 长文档AI审核的审计设计:Map-Reduce优于检索增强
  • AI Agent辅助发现SharePoint RCE漏洞链(CVSS 9.1)
  • 我用Claude Code将API的P99延迟降低一半
  • AI Agent读了你的secrets并删了生产数据库——PocketOS事故详解
  • 用聊天模型做金融内容审核:结构化输出设计实践
  • Prompt注入攻击原理与防御实践指南
  • 大规模漏洞扫描活动泛滥,攻击者冒充ClaudeBot等AI爬虫
  • 谷歌DeepMind发布手语转文本模型SL2T
  • LFM2.5-VL-3B:边缘设备高性能视觉语言模型发布
  • 通义千问3.8-27B发布,刷新开源大模型参数效率
  • 多Agent协作陷阱:个体测试全过,团队输出仍错误
  • Agent Plugins:Vercel/OpenAI/Microsoft 等联合推出 Agent 技能打包新标准
  • 企业实战:50+ AI Agent在UK主权云上的部署架构
  • ZeroGPU Router:让 AI Agent 用小模型处理例行任务
  • Solv Labs在AWS Bedrock上构建可审计的Agent支付系统
  • CodeBurn:让AI编程投入产出可见化
  • AWS SageMaker HyperPod分层KV缓存:LLM推理新范式
  • 2026年AI Agent安全开发指南
  • 从专有LLM API窃取推理痕迹研究
  • AI代码审查门控:让AI生成的补丁先自证再合入主分支
  • AI 正在消灭软件工程中层阶级
  • 企业 AI 分析的隐藏失败模式:语义漂移
  • 四步修复:让ChatGPT/Perplexity等AI搜索正确引用你的网站
  • CI发布成功却无人能安装:JetBrains插件三周静默故障复盘
  • MCP vs A2A协议解析:Agent连接协议选型指南
  • Adobe紧急修复:Campaign Classic与ColdFusion四个10.0严重漏洞
  • AI Agent自主搭建付费媒体商店:零人工注册的云服务开通实验
  • 用Claude构建骨架技术文档:Doc-to-Code追踪矩阵实践
  • 企业集成测试:单元测试无法覆盖的测试维度
  • AI 助手常用的启动模板:Demo 专用,上生产有坑
  • 英伟达 Nemotron 4 瞄准万亿参数,宣称超越中国大模型
  • AI Agent实测1200次运行费用仅1.2美元
  • Code-Graph-RAG:把整库变成知识图谱,让 AI 真正理解代码结构
  • 已加载 51 / 9275
8.0
热点
AI SCORE
编程提效2026-08-12 22:31

我用Claude Code将API的P99延迟降低一半

dev.to · AI#Claude Code#性能优化#AI编程
Editor brief · 编辑速览

开发者用Claude Code配对编程分析checkout API间歇性高延迟,发现两处隐藏在「数据库嫌疑」背后的错误,最终将p99从2.1s降至900ms。

文章思维导图
Knowledge map
拖拽缩放
Full translation

完整中文译文

几周前,我们的 checkout API 在"慢接口"仪表盘上出现了。不是宕机,也不是报错——只是变慢了。p50 还好,维持在 180ms,但 p99 在大约一个月内悄悄爬升到了 2.1 秒。直到有客服工单提到"结账有时候感觉卡卡的",才被人注意到。

这个"有时候"才是烦人的地方。间歇性的尾延迟是软件调试中最棘手的问题之一,因为:

  • 它不会在你的本地开发环境里出现
  • 合成压测命中的是平均情况,而非奇怪的尾分布
  • 大家的第一反应("肯定是数据库的问题")通常都是错的,或者只对一半

在实际动手之前,我们最先尝试的是给怀疑的列加了个数据库索引。结果 p50 只少了约 40ms,p99 纹丝不动。这通常说明你在解决错误层次的问题——如果痛点在尾延迟,那修复方案必须针对触发尾延迟的请求到底做了什么不同的事,而不是去优化平均情况的查询计划。

我平时会花一天加日志、部署、等待流量、看链路追踪。这次我决定把 Claude Code 当成一个真正的性能分析搭档来用,而不是仅仅当成写代码的工具——喂给它真实数据,让它形成假设,让它写出验证每个假设的插桩代码。

步骤 1:获取真实数据,而不是猜测

第一步是从链路追踪后端导出一批慢请求样本(p95+),以 JSON 格式连同接口源码一起交给 Claude Code:

Here are 40 traces where checkout took >1.5s. Here's the handler code.
Find the pattern — what do the slow ones have in common that the fast ones don't?

不到几分钟,它就标记出了一个我漏掉的东西:每条慢 trace 的 line_items 数量都超过了 12。超过一打商品的订单,总是那批超过 1.5 秒的。小订单始终很快。

这是一个比"数据库慢了"好得多的切入点。

步骤 2:本地复现

Claude Code 写了一个快速的种子脚本,生成不同 line_items 数量(1、5、12、25、50)的订单,并在 checkout handler 外面套了一个小型的基准测试工具:

import time

def bench_checkout(order):
    start = time.perf_counter()
    process_checkout(order)
    return time.perf_counter() - start

for count in [1, 5, 12, 25, 50]:
    order = make_order(line_items=count)
    elapsed = bench_checkout(order)
    print(f"{count} items: {elapsed*1000:.1f}ms")

输出让问题立刻暴露了:

1 items: 42.1ms
5 items: 58.3ms
12 items: 210.4ms
25 items: 980.7ms
50 items: 2340.1ms

这不是线性增长——是二次方的。checkout 路径里有什么东西随着商品数量的平方而非线性增长。

步骤 3:找到真正的二次方循环

我让 Claude Code 追踪 process_checkout 并标记所有对 line_items 嵌套迭代的地方。它大约一分钟就找到了罪魁祸首——一个折扣应用函数,对每个商品行都要重新扫描整个商品列表来检查是否有捆绑折扣:

# The bug: O(n²) — for each item, rescan all items
def apply_bundle_discounts(line_items):
    for item in line_items:
        for other in line_items:
            if is_bundle_pair(item, other):
                item.discount += bundle_discount(item, other)
    return line_items

过去平均订单只有 3-4 件商品时这没问题。没人碰过这个函数好几个月了——它只是随着我们两个月前上线的"批量订单"功能带来的平均购物车大小增长而悄悄恶化。这是一个典型的系统某部分的变化(批量订单)暴露了完全无关部分(折扣逻辑)中潜伏 bug 的案例,没人想过要重新检查。

修复方案是把商品按 is_bundle_pair 实际检查的属性预先建立索引,这样每个商品做一次查找而不是全量重新扫描:

# O(n) — group once, then look up
def apply_bundle_discounts(line_items):
    groups = index_by_bundle_key(line_items)
    for item in line_items:
        for other in groups.get(item.bundle_key, []):
            if other is not item:
                item.discount += bundle_discount(item, other)
    return line_items

步骤 4:检查同类问题

这就是有 agent 来做这件事真正值回票价的地方。我没有在找到这一个修复后就停下,而是让它在代码库里搜索相同形状的 bug——对同一个集合的嵌套循环:

Search the codebase for any function with a nested loop over the same
list variable (for x in items: for y in items:). Flag each one and
tell me if it looks intentional or accidental.

它找到了另外三处。其中两处确实没问题(小而有界的列表,比如 3 项配送选项列表)。有一处是库存预留路径中的第二个真实 bug,但因为还没被足够大的订单触发过所以没在 trace 里出现过——一颗等待引爆的地雷。我也把它修了。

这一步让我印象深刻的不是 agent 找到了 bug——grep 也能找到嵌套循环。真正有价值的是它对每个命中都给出了通俗易懂的说明,包括那两个假阳性,这样我就不必手动为每个匹配重新推导"这实际上是有界的吗"。这种分类筛选步骤通常是枯燥的部分,也是让人干脆跳过搜索的原因。

步骤 5:用真实流量形态验证

在收工之前,我重新跑了基准测试工具,也用一批真实的慢 trace 订单在修复后的代码上回放了一遍:

1 items: 41.8ms
5 items: 54.2ms
12 items: 71.6ms
25 items: 94.3ms
50 items: 138.9ms

50 件商品的订单从 2.3 秒降到了 139 毫秒。部署后,checkout 接口的 p99 在一天内稳定在 860ms——剩下的尾延迟大部分是来自支付提供商网络的正常延迟,不是我们的代码。

"肯定是数据库的问题"是一个假设,不是诊断。我已经记不清这句话有多少次被证明是错的了。先拉取真实的 trace 数据,让数据来替你挑选假设。

给 agent 喂真实的 trace 数据比用文字描述问题强得多。当我给 Claude Code 的是真实的慢 trace 而不是我自己总结的("结账有时候卡"),它找到 line_items 相关性的速度比我自己盯着同样数据看还要快。

二次方 bug 会藏在显眼的地方,直到你的数据形态发生变化。这个函数"没事"了两年,因为没人有过 50 件商品的购物车。一个完全无关的功能(批量订单)暴露了它。性能 bug 往往是潜伏的,不是新产生的。

一旦找到一个 bug 模式的实例,立刻搜索它的同类。库存预留中第二个嵌套循环 bug 就会是下个月的故障。模式匹配整个代码库正是 agent 擅长而我擅长(我在看完第三个文件之后就烦了)的枯燥、机械化搜索。

修复前后都要跑基准测试,用同一套工具。这样才能自信地说 p99 真的移动了,而不是靠猜。

在错误的列上加索引只是把瓶颈移走了,并没移除它。我们第一次那个"数据库形状"的修复尝试几乎没动 p99,因为实际成本在应用代码里,不在查询里。如果一个"修复"只移动了 p50,要小心——你可能只是在治标。

我正在把"每次修复后搜索同类 bug"这一步变成习惯而不是一次性的事——成本很低,而且已经抓住了一颗实际存在的地雷。下一个要做的就是对我们的搜索接口做同样的性能分析,它有类似的尾延迟投诉。

如果你也有一个"有时候慢"的接口而没人能定位,先拉取真实的慢 trace 再猜测。好奇大家都有什么二次方 bug 的故事——写在评论区吧。

如果这篇文章有用,在 Dev.to 上关注我——我定期写这类构建日志。

Original source

本文由 AI 翻译整理自 dev.to · AI,原文版权归原作者所有。

阅读英文原文
上一篇
AI Agent辅助发现SharePoint RCE漏洞链(CVSS 9.1)
下一篇
AI Agent读了你的secrets并删了生产数据库——PocketOS事故详解