动态程序分析 (DPA)
动态程序分析(或 DPA)是一个在 ReSharper 的后台运行的过程,用于检查您的应用程序是否存在以下相关问题:
内存分配 – 闭包以及分配到大对象堆 (LOH) 和小对象堆 (SOH) 的内存。
数据库使用 – 命令执行时间过长、大量打开的连接等。
ASP Web 应用程序 – 请求处理时间过长、大量打开的连接等。
DPA 会在每次您在 ReSharper 中运行解决方案时自动启动。 数据的收集几乎没有额外开销:我们在各种真实解决方案上测试了 DPA,性能下降在 0% 到 2% 之间。
为了更容易理解 DPA,您可以将其视为始终开启的性能分析:您无需运行性能分析器、启动分析会话或获取快照。 只需像往常一样工作,当您运行解决方案时,所有数据都会在后台收集。

有关更多详细信息,请参阅 开始使用 DPA。
支持的操作系统和框架
操作系统 | 框架 |
|---|---|
Windows | .NET Framework、.NET Core、.NET |
Linux、macOS 仅适用于 JetBrains Rider | .NET Core 3.0 及更高版本、.NET 5.0 及更高版本 |
先决条件
DPA 基于 Windows 事件跟踪 (ETW)。 为了接收 ETW 事件,DPA 使用了必须安装在系统中的特殊服务 'JetBrains ETW Host Service'。 通常,您会在安装 ReSharper 时一并安装此服务。 如果未安装此服务,DPA 将处于非活动状态。
在这种情况下,您可以在 Visual Studio 中启用 DPA。 为此,请打开 动态程序分析 工具窗口()。 在工具窗口中,单击 运行一次 'ETW Host Service' 链接。 ReSharper 将在无需安装的情况下启动该服务。 请注意,该服务将在系统重启之前一直运行。
开始使用 DPA
实际上,DPA 不需要您采取任何额外步骤即可开始使用。 像往常一样工作,只需对您的工作流程进行一些小的调整:
每次运行或调试项目完成后,请注意状态栏中的 DPA 图标。 如果它是红色的,如此处所示,
,请单击它并选择 查看问题。查看问题列表。 在此步骤中,您可以:
修复问题后,请再次运行项目,并确保该问题不再出现在 DPA 列表中。
理想情况下,您应该看到绿色的 DPA 图标,如下所示:
。
DPA 的工作原理
如果在执行期间,程序超过了 指定的阈值 (例如,分配的内存大小),则发生分配的该方法将被视为一个问题。 DPA 会将此方法添加到 动态程序分析 窗口中的问题列表中。

负责分配的确切代码行会在编辑器中高亮显示。

调用路径上的所有方法和代码行也会被高亮显示。

如果您更改了标记为问题的方法的代码,DPA 会将其视为尝试修复该问题。
如果修复后问题值降至阈值以下,DPA 会认为问题已修复,并将其从列表中移除。
如果修复后问题值仍高于阈值,DPA 会使用此新值更新列表中的问题。
如果您未更改标记为问题的方法的代码,DPA 会向您显示新的问题值以及所有运行中的最高问题值。

更详细地说:对于每个问题,DPA 会存储两个值:记录的最大值和最后一次运行的值。 这可以防止误判 – 一个问题可能会因为低于阈值而从问题列表中消失,但这并不是因为它已被修复,而是因为启动条件发生了变化(例如,程序运行时间较短,未执行所需功能等)。 只有在您未在运行之间更改问题背后的代码时,才会显示最大值。
DPA 不会在列表中显示 已静音和已抑制的问题 ,也不会在编辑器中高亮显示相应的代码。
目前,无法查看完整的问题历史记录。
由于 调试 和 发布 构建彼此不同,DPA 会分别跟踪每个解决方案的构建配置。 动态程序分析 窗口显示当前选定构建配置的问题。

仅当超过 100 KB 分配阈值时,ETW 才会引发内存分配事件。 因此,DPA 对内存分配问题的粒度级别为 100 KB。
关闭 DPA
如果 'JetBrains ETW Host Service'正在系统中运行,DPA 默认处于启用状态。 要禁用 DPA,请单击状态栏中的 DPA 图标(
或
),然后选择 禁用动态程序分析。