viztracer 在 ROS 开发中的使用
VizTracer 是一种低开销的日志记录/调试/分析工具,可以跟踪和可视化您的 python 代码执行。
前端 UI
由 Perfetto
提供支持。使用A
、W
、S
、D
缩放/导航。
感谢 VizTracer
的作者大佬高天开发的 python 调试、分析利器VizTracer
特点
- 在时间轴上详细记录了函数进入/退出信息以及完整源代码
- 超级易于使用,大多数功能无需更改源代码,无包依赖性
- 性能开销低,可能是市场上最快的跟踪器
- 支持线程、多处理、子进程、异步和 PyTorch 的调试
- 使用了强大的前端框架,能够流畅渲染 GB 量级的跟踪数据
- 良好的跨平台特性,适用于 Linux/MacOS/Windows
基本环境安装
- pip 安装 VizTracer
pip install viztracer
pip install viztracer
VSCode 安装及配置
- 安装 VizTracer
vscode 插件市场搜索 VizTracer
安装即可
- 配置 VizTracer 扩展
这样,就可以在运行时,自动生成 VizTracer 的追踪文件,并自动打开浏览器进行查看
在命令行中运行 VizTracer
在命令行中运行 VizTracer,并指定要跟踪的 python 文件
无需传参运行 VizTracer
生成 VizTracer 的可视化文件result.json
python3 -m viztracer my_script.py
python3 -m viztracer my_script.py
在浏览器中打开 VizTracer 的可视化文件
vizviewer result.json
vizviewer result.json
技巧
可以在使用时添加--open
参数,这样就可以在运行时自动打开浏览器进行查看,完整命令如下:
python3 -m viztracer --open my_script.py
python3 -m viztracer --open my_script.py
传参运行 VizTracer
python3 -m viztracer my_script.py arg1 arg2
python3 -m viztracer my_script.py arg1 arg2
VSCode 中运行 VizTracer
VizTracer 追踪 ROS 程序
可以详细看到,程序在运行时的调用栈,以及函数的执行时间等关键细节信息
完整的时间线追踪
create_subscription
函数调用栈
可以看到订阅者创建的调用栈持续了 30 ms
spin_once
函数调用栈
而 spin_once
函数调用栈单次持续了 124ms 秒,与订阅者创建的调用栈相比,两者相差约 4 倍。
有了这些信息,我们就可以非常容易得可视化的找到性能瓶颈位置,并针对程序进行优化。
限制
VizTracer 使用 sys.setprofile() (Python3.12 之前)和 sys.monitoring(Python3.12 之后)作为其分析器功能,因此它会与也使用这些机制的其他分析工具发生冲突。使用 VizTracer 时要注意这一点
WSL1 上的时钟分辨率和延迟非常糟糕,因此如果您使用 WSL1,您可能会遇到额外的开销。除了升级到 WSL2 之外,没有其他解决方案。
VizTracer 与其他需要在模块内执行任意代码的 Python 工具一样,可能会与检查顶层模块或具有其他结构要求的代码发生冲突。例如,如果您从命令行使用 VizTracer,unittest.main() 将不起作用。有一些方法可以避免它。您可以使用内联 VizTracer,它始终有效。或者您可以将模块指定为 unittest.main() ,这不是通用解决方案,但无需进行太多代码更改即可工作。
参考
- [1] VizTracer