gpt4 book ai didi

c# - 测量许多方法的执行时间

转载 作者:太空狗 更新时间:2023-10-30 01:04:43 24 4
gpt4 key购买 nike

我在 WPF 项目中工作,该项目使用 Entity Framework 和 SQL Server。那里的优化很糟糕。一切都太慢了。而且我想诊断代码的哪些部分会降低性能 - 我认为只有少数(我的意思是很多,但不是全部)设计不当并会降低性能的地方。

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

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

我想测量大约 100~ 个在许多类中具有“从数据库中选择”的方法。SQL Server 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();
}

现在我正在考虑为每个方法添加秒表,测量执行时间,计算执行次数并将其传递给某个单例或其他东西,然后显示它。当然,我会在完成此诊断后关闭它,但这种方法是非常周的类(class)我需要编辑每个方法而且我不知道如何在之后将其关闭 - 我的意思是我知道我可以使用类似于 #define DEBUG 但无论如何它是蹩脚的。

我试图用 Reflections 解决一些问题,但没有效果......也许有一种方法可以查看 C# 中方法的执行时间?

您有什么建议?

最佳答案

我的第一个推荐是合适的分析器,我最喜欢的是 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
}
}

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

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

这是一次检测许多方法所需的所有代码。

我最近就是这样做的,我将所有测量值转储到 csv 文本文件中,然后将其转储到 SQL Server 中,然后我可以轻松地进行选择和分组,例如找出方法消耗的总时间。我没有使用探查器,因为我是在生产环境中进行测量的——仪器对性能的影响并不大(如果程序很慢的话)。

这里有更多相关信息: http://www.postsharp.net/aspects/examples/logging

即使是它的免费版本 - PostSharp Express - 也足以做到这一点。

关于c# - 测量许多方法的执行时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22050493/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com