带有 SQL 的 Visual Studio 2010 探查器
Posted
技术标签:
【中文标题】带有 SQL 的 Visual Studio 2010 探查器【英文标题】:Visual Studio 2010 profiler with SQL 【发布时间】:2011-05-24 19:06:56 【问题描述】:我正在使用 Visual Studio 2010 的内置分析器来查看一段性能不佳的代码。但是,我看到一些不太有意义的结果。这是报告的截图:
这似乎表明 Regex.Replace 是瓶颈(因此我应该尽量减少或消除这种使用)。但是,这感觉不准确,因为我知道这段特定的代码部分正在大量使用数据库,因此我希望 SqlCommand.ExecuteNonQuery 在本报告中至少比正则表达式高一点,如果不是更占主导地位的话使用。
所以,我的问题是:这个分析器工具对涉及数据库访问的任何事情都没有用,因为 SQL 工作是由另一个进程(即 SQL 服务器)完成的,因此我必须以其他方式对其进行测量?
【问题讨论】:
【参考方案1】:Visual Studio 分析器有两种操作模式,采样和检测。 在采样模式下,阻塞时不抽取样本,与 I/O 一样。 因此,它无法向您显示调用树的任何部分,除了叶子正在执行原始 CPU 处理的部分。
您正在使用采样模式。试试仪表模式,它按挂钟时间运行,因此它包含 I/O。
无论你做什么,请忽略独享时间。只注意包含时间,占总时间的百分比。 您正在寻找代码中大部分时间都处于活动状态的例程,其中大部分时间用于调用其他例程, 并且您正在寻找可以不用的电话。
附:我做this,它总是有效的。
【讨论】:
“请忽略独占时间”。当我处于仪表模式时,还是总是? @mgroves:总是。它包含在包容性时间中。在像您这样的真实软件中(与不调用函数的小 1 页算法相反),您代码中的所有例程的独占时间都可以忽略不计。简直是养眼。代码中的耗时者实际上是各种类型的函数调用。您需要找到在挂钟时间中大部分时间都处于活动状态的那些。不在您的代码中的耗时者,您无能为力。 @mgroves:顺便说一句,这就是为什么编译器优化对您的代码的影响可以忽略不计 :-) 嗯,这说明了一件事:当我做 Project Euler 问题时,我发现独家示例非常有帮助,但 Euler 解决方案不是“真正的”程序 :) @mgroves:对。理论和实践都很重要,而且完全不同。【参考方案2】:在我看来,关于 SQL 工作,您对 Visual Studio 分析器的假设是正确的。
为了检查您的 SQL 工作,更好的选择是运行 SQL Profiler 并跟踪您的查询。您可以设置 SQL 分析器,以显示来自您的应用程序的所有传入查询(...对于相关数据库)的执行计划。这将表明它是您的 SQL 工作还是快照显示的 Regex.Replace。
哈桑
【讨论】:
【参考方案3】:Visual Studio Profiler 是一个CPU Profiler。 CPU Profiler 可用于分析 CPU 绑定程序或 IO 绑定程序的 CPU 绑定部分。以下是这些术语的介绍:
CPU bound I/O bound由于您的进程受 I/O 限制,因此 CPU 分析器无法帮助您加快程序运行速度。正如您所怀疑的,您将不得不使用其他工具来分析 SQL 查询,例如:
SQL Server Profiler或许多其他工具之一。
【讨论】:
【参考方案4】:您可能还会发现“Tier Interaction Profiling”选项对于使用 Visual Studio 2010 分析器调查 SQL 问题很有用。您可以在性能向导的第 3 页或会话属性中启用此选项(有关屏幕截图,请参阅our blog)。
使用此模式收集数据后,切换到“Tier Interactions”视图,您将看到有关 SQL 调用的详细信息,包括调用次数和经过的时间(图片来自 profiler 博客)
【讨论】:
以上是关于带有 SQL 的 Visual Studio 2010 探查器的主要内容,如果未能解决你的问题,请参考以下文章
带有 Visual Studio 2008 的 SQL Server Compact
带有 SQL Server 2008 和 Office 2007 的 Visual Studio 2010 的正确安装顺序?
在 Visual Studio 中为 SQL Server 上运行的报表设置数字格式
EntityFramework 连接到 Visual Studio SQL Server (localdb)