如何持续测量 EF 性能?

Posted

技术标签:

【中文标题】如何持续测量 EF 性能?【英文标题】:How to continuously measure EF performance? 【发布时间】:2016-08-26 10:24:46 【问题描述】:

我有一个使用 Entity Framework 4 的大型应用程序。它是服务器上的 WCF(托管在 Windows 服务内)和客户端上的 WPF。 它的某些部分很慢,我想知道是不是因为数据库访问很慢。 我想持续测量该代码的性能,例如在某处记录每个查询的执行时间(最好包括 EF 自己的东西,如物化)以便稍后分析。我怎么做? 像 EFProf 这样的工具(因为即使他们可以测量数据库服务器执行特定查询所花费的时间,我如何运行它们一周?)和 Glimpse(它不支持 Windows 服务和 WPF)在我的情况下不支持。 我考虑过制作自己的 SqlConnection 子类,但我的版本只接受 ObjectContext ctor 中的 EntityConnection,并且 EntityConnection 被标记为密封。而且这个选项只允许测量原始 sql 查询的执行时间,而不是 EF 的代码。 我现在看到的唯一选项是:1)更新到 EF 6 并编写 SqlConnection 子类(这不会测量 EF 自己的代码)2)更新到更高版本并使用类似EF hooks library 当然,它不在书上(只看 Mastering Enity Framework)——因为我们大多数人只需要使用库,不知道它有多快(讽刺)。

【问题讨论】:

要查看执行的查询日志,您不必编写 SqlConnection 子类,设置 context.Database.Log = Console.WriteLine; 就足够了。只需将 Console.WriteLine 替换为您自己的日志操作即可。但正如你所说,这只能让你测量查询执行时间,而不是 EF 代码。 为什么不配置数据库呢?如果您看到具有高 IO 或持续时间的查询,请通过调整 DB 对象(如索引)或找到 EF 语句并对其进行调整来调整这些查询。 @Igor 数据库本身可能不是问题 @AdilMammadov 我认为需要更新到 EF6 看看怎么样:getglimpse.com 【参考方案1】:

在 linq 表达式缓存和 SQL 服务器选择缓存的内容方面都进行了各种优化,唯一的方法是衡量您的性能速度和内存消耗

对于您的情况,我认为微软通过“Measuring Entity Framework Performance using ETW”提供了一种简单的方法

此外,您可以通过 SQL 分析器获取其中一些信息,这只是更多的工作。

【讨论】:

你忘了说它需要更新到 EF 6。不过,它看起来是个不错的选择

以上是关于如何持续测量 EF 性能?的主要内容,如果未能解决你的问题,请参考以下文章

如何测量 powershell 脚本中不同功能的持续时间(以秒为单位)?

在使用 K6 时测量 x 个请求的持续时间

精确的音调开始/持续时间测量?

PLSQL - 测量过程的执行持续时间

EF 和表值函数性能

fft Matlab 振动时域到频率测量持续时间 = 60 s