Bob Belderbos:Profile First:一个... 笔记

Bob Belderbos:Profile First:一个快 10 倍的 Django 测试套件

作者 Rust Platform Django 测试套件最初运行耗时 30 秒,引发了对数据库性能的猜测。然而,使用 cProfile 进行剖析后发现,真正的瓶颈并非与数据库相关,将运行时间缩短至 3 秒。本文强调应通过测量性能而非凭空猜测解决方案(如 fixtures 过多或数据库缓慢)来定位问题,并主张使用剖析工具(如 cProfile)识别具体瓶颈。作者利用 cProfile 生成了 pstats 文件,随后使用 profiling-explorer 对数据进行可视化。剖析结果显示,Django 默认密码哈希器 _hashlib.pbkdf2_hmac 在测试期间消耗了过多时间。该哈希器故意设计为缓慢以抵御暴力破解攻击,但却不必要地拖慢了每一个创建用户的测试。通过仅用五行代码将测试专用的哈希器切换为更快的 MD5,问题得到了有效解决,测试套件执行时间显著降低。在此初步优化之后,耗时次多的函数是 cursor.execute,起初看似可能存在 N+1 查询问题。然而,进一步测量确认并未发生 N+1 查询;高调用次数归因于合法的测试设置操作。这一经历再次印证了核心观点:在优化之前务必先进行剖析,以避免徒劳无功和错误假设。
CdXz5zHNQW_5c2sgQR2VI.png