如何分析在 Windows 上运行的 C++ 代码?

Posted

技术标签:

【中文标题】如何分析在 Windows 上运行的 C++ 代码?【英文标题】:How can I profile C++ code running on Windows? 【发布时间】:2020-06-10 13:14:04 【问题描述】:

我有一个 C++ 应用程序,在 windows10(AMD Ryzon 处理器)上运行,我正在进行基准测试和优化。 谁能推荐一个 AMD Ryzen 处理器下的性能分析工具?

【问题讨论】:

Windows 的一个问题是它运行多个线程和任务。您的程序可能会运行几次迭代,然后另一个程序运行一段时间,然后再运行另一个,依此类推。对于质量性能检查,您需要弄清楚如何解决这个问题。 你能在调试器或IDE下运行它吗?那就试试this @ThomasMatthews 由于 CPU 涡轮/节流、热负载和其他因素(包括环境室温),情况比这更糟。 【参考方案1】:

有一些来自 AMD 的分析器,例如

https://developer.amd.com/amd-uprof/

AMD uProf 支持以下操作系统的 64 位版本:... Microsoft Windows 10(截至 2019 年 5 月更新)

AMD uProf 支持以下应用环境:语言:C、C++、...

AMD uProf profiler 采用基于统计抽样的方法来收集配置文件数据,以识别应用程序中的性能瓶颈。配置文件数据收集可以由 – 6OS 计时器、核心 PMC 事件和 IBS 触发。 AMD uProf 提供用户友好的 UI 来查看和分析配置文件数据,从而有助于优化各种应用程序、驱动程序、游戏引擎等。

因此,它支持硬件和软件事件,并且可以进行采样分析。

还有AMD CodeAnalyst / CodeXLprofilers,不过现在不容易下载https://community.amd.com/thread/159836。

Intel VTune 商业分析器也可以在 AMD 芯片上工作,但不能完全支持硬件事件。软件事件应该可以工作。

【讨论】:

tthank you for answer 实际上这不是我要寻找的工具,我想要一个显示代码中每个函数的执行时间的工具。 Aisha,分析通常以周期性采样(每秒 1000 次)的形式完成,并记录在该采样时刻执行线程(程序)的位置。为了记录每个函数的所有执行时间,每个调用和返回都应该使用额外的代码来记录进入和退出的时间。这将产生巨大的开销。英特尔 PIN 或 valgrind 等一些工具可用于尝试为现有代码构建此类测量(动态重新编译);当可以重新编译代码时,需要编译器工具。你的 C++ 编译器是什么? (具有不同 _mcount 的 Gcc -pg / gprof?)

以上是关于如何分析在 Windows 上运行的 C++ 代码?的主要内容,如果未能解决你的问题,请参考以下文章

如何分析 Rcpp 代码(在 linux 上)

C++ 程序在 Linux 上完美运行,但不能在 Windows 上运行

在 Windows 上运行并生成 Linux 代码的 C++ 编译器

如何在 Windows ( C++ ) 中创建进程以运行另一段代码?

Windows 上最好的免费 C++ 分析器是啥? [关闭]

如何在windows c++中的cmd中运行命令后获取退出代码