c# - PerfView:分析应用程序的性能,包括数据库调用

标签 c# .net performance profiling perfview

我目前正在使用 PerfView 为我的 (C#) 应用程序进行性能分析。 但通常这些应用程序会使用大量数据库调用。 所以我问自己这样的问题: - 在 Repositories 中花费了多少时间? -(等待 SQL 查询返回花费了多少时间?)-> 我不知道这是否有可能通过 PerfView 发现

但是从我的痕迹中我几乎得不到任何有用的结果。在“任何堆栈” View 中,它告诉我(当我在我的存储库上使用分组时)我的 Repsoitory 花费了 1.5 秒(整个调用大约 45 秒)。而且我知道这不是真的,因为存储库调用数据库很多。

是否只是在等待 SQL 查询完成时未捕获 CPU 指标,因为 CPU 在这段时间内无事可做,因此我的时间只包括存储库中的数据转换时间等?

感谢您的帮助!

编辑:

我错过的是打开线程时间选项来获取阻塞代码的时间(我想这是在数据库调用期间发生的事情)。我现在得到了所有的堆栈,只是过滤掉了无趣的东西。但我似乎一无所获。

使用“线程时间”时对我来说特别有趣的是 BLOCKED_TIME。但我认为有了它,时代就结束了。当您查看屏幕截图时,它告诉我 CPU_TIME 是 28,384。这是毫秒 (afaik),但 BLOCKED_TIME 是 2,314,732,不能是毫秒。因此 CPU_TIME 的百分比非常低,只有 1.2%,但 70 秒中的 28 秒仍然很多。所以包容性百分比时间在这里比较苹果和橘子。有人可以解释一下吗?

PerfView "Thread Time Stacks" View after about 70 seconds analysis of a WCF service call

最佳答案

所以,我成功了。

我错过的(实际上 Vance Morrison 在他的视频教程中对此进行了解释)是:当使用 perfview 进行挂钟时间分析时,您会从所谓的“等待”中的所有线程中获得累积时间“BLOCKED_TIME”。这意味着在 70 秒的时间内,单独的终结器线程会为此“BLOCKED_TIME”增加 70 秒,因为它坐在那里什么都不做(至少在我的情况下几乎没有任何事情)。

因此,在进行挂钟时间分析时,过滤掉您感兴趣的内容非常重要。例如,搜索占用最多 CPU 时间的线程,并将其包含在您的分析中,然后继续向下堆栈以查找昂贵的代码片段(并且还可能导致数据库或服务调用)。一旦您从方法的角度进行分析,您就会真正了解在该方法中花费的时间,而累积的“BLOCK_TIME”不在画面中。

我发现最有用的是在我自己的代码中搜索“看起来很耗时”的方法,我切换到这个方法的调用者 View 。这从它被调用的地方以及在被调用者中查看是什么导致了堆栈进一步消耗时间(存储库中的数据库调用或获取一些数据的服务调用)。

有点难以解释,但一旦我真正理解了挂钟时间分析的基础知识,在某些时候一切都变得有意义了。

我推荐这个视频教程:http://channel9.msdn.com/Series/PerfView-Tutorial

再一次,伟大而强大的工具!

关于c# - PerfView:分析应用程序的性能,包括数据库调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28717007/

相关文章:

c# - 如何在 C# 中将 HTML 设置为剪贴板?

c# - 设置与房间相关的 ExtendedProperties

c# - 0 值的 System.Text.Encoding.Default.GetString(byte[]) 结果

r - 在 R/Rcpp 中过滤 data.frame 列表列内容的最快方法

performance - 将位向量转换为一位

c# - ASCII编码和编码之间的区别

c# - Bing Maps REST API 将坐标转换为邮政编码或类似信息

.net - 如何让 gif 动画在 WPF 中工作?

c# - Expression<Func<T>> 是否适用于混合静态/实例成员?

c# - SQL Server 响应时间不一致