测量多种方法的执行时间

use*_*649 4 c# sql-server entity-framework

我在WPF中的项目中工作,该项目在SQL Server中使用实体框架。最佳化有废话。一切都太慢了。而且我想诊断代码的哪些部分会降低性能-我认为只有少数(我是说很多,但不是全部)设计不良的地方会降低性能。

现在,对于每个表,我们都有一个类,例如UserRepository。它不完全是存储库模式。这些类具有以下方法:GetAll(...), GetById(...), GetNewest(...), GetAllWithHigherSalaryThan(int salary, int companyId),等等,许多db的方法访问器。数据库仅在存储库类中使用。

我不想在这里谈论重构。我只想测量每个方法执行多长时间以及在运行时执行了多少次。通过这些信息,我将能够找到错误。

我想测量大约100个方法,这些方法在许多类中都有“从db中选择”。SQL Server Profiler不能解决问题,因为无数次地执行了这些方法,并且如果可能的话,使用我们的数据库方法来分析来自Profiler的日志是噩梦。

采样方法:

public IEnumerable<Foo> GetFoo(int y, int z)
{
        return Context.Where(p =>
            p.X == null &&
            p.Y == y &&
            p.Time >= z).OrderBy(x => x.Time).AsEnumerable();
}
Run Code Online (Sandbox Code Playgroud)

现在我正在考虑将秒表添加到每种方法中,测量执行时间,计数执行次数并将其传递给某个单例或其他某个东西,然后显示它。当然,在完成诊断后,我将关闭该诊断程序,但是这种方法非常需要一周的时间,我需要编辑每种方法,而且我不知道以后如何将其关闭-我是说我知道我可以使用像,#define DEBUG但无论如何都是is脚。

我试图通过反射来解决问题,但是没有效果……也许有一种方法可以查看C#中方法的执行时间?

你有什么建议吗?

Lev*_*Lev 5

我的第一个建议是使用适当的探查器,我的最爱是Jetbrains的dotTrace,但还有其他一些。

如果以某种方式这不是一个选择,而您坚持要自己做:

我建议使用Postsharp-或其他AOP软件包。它可以做的是轻松地将方面添加到许多方法中。

使用Postsharp,您可以编写一个方面:

[Serializable] 
public class TraceAttribute : OnMethodBoundaryAspect 
{ 
    public override void OnEntry( MethodExecutionArgs args ) 
    { 
        // start measuring time here
    } 

    public override void OnExit( MethodExecutionArgs args ) 
    { 
        // stop measuring here 
    } 
}
Run Code Online (Sandbox Code Playgroud)

然后将这一方面应用到一堆方法(MyNamespace的所有公共方法):

#if DEBUG 
[assembly: Trace( AttributeTargetTypes = "MyNamespace.*", 
    AttributeTargetTypeAttributes = MulticastAttributes.Public, 
    AttributeTargetMemberAttributes = MulticastAttributes.Public )] 
#endif 
Run Code Online (Sandbox Code Playgroud)

这是同时检测多种方法所需的所有代码。

我最近刚刚这样做,我将所有测量结果都转储到了csv文本文件中,然后又将其转储到了SQL Server中,在那里我可以轻松地进行选择和分组,例如,找出一种方法消耗的总时间。我之所以没有使用分析器,是因为我在生产环境中进行了测量-仪器的性能影响不会太大(如果程序运行缓慢)。

以下是有关此信息的更多信息:http : //www.postsharp.net/aspects/examples/logging

甚至免费版本的PostSharp Express也足以做到这一点。