有没有办法从属性测量 C# 函数执行时间?

Posted

技术标签:

【中文标题】有没有办法从属性测量 C# 函数执行时间?【英文标题】:Is there a way to measure C# function execution time from an attribute? 【发布时间】:2014-06-20 21:32:58 【问题描述】:

我希望为系统中的某些重要函数调用发布自定义性能计数器。我想在生产环境中持续监控这些性能计数器。

有没有办法让我用自定义属性标记某些函数,该属性可以测量执行给定函数所花费的时间?我想避免注入自定义代码,从而用监控代码污染与业务相关的功能。

属性中的代码如何跟踪函数执行所用的时间?

请不要建议使用 Profiler。我不打算调试或基准测试性能。但只是想在生产中 24/7 跟踪它。

【问题讨论】:

是用于 Web 应用程序 (ASP.NET) 还是桌面(WinForms、WPF)? 或 Windows 服务......这是为了监控某些框架级代码的性能,这些代码可以被不同的消费者使用 由于您将更改(您需要)您的代码以添加该属性,如果您将您的 code 放入 Action i> 或 Func 并因此将执行包装到 测量函数 中?这就是我为我正在工作的项目所做的。虽然它没有使用属性那么优雅,但它不需要任何(复杂的)依赖项。 希望能够无缝。但是,是的,我想你的方式会是另一种选择 @Igorek 许多 DI 容器允许您以真正无缝的方式完成它。请参阅我的答案中的更新。 【参考方案1】:

好吧,你需要一些代码来执行你的函数并分析你的attribute,这样它就会知道它需要在你的函数之前和之后执行一些东西(例如执行时间测量,在你的情况下) - 它可能正在使用Decorator 设计模式、Reflection、Proxy object 等等。

正如您所标记的,这是一个方面编程问题,您可以利用PostSharp 第三方来实现它。

看看这个关于Performance Counters using PostSharp的特定页面,它确实是使用属性:http://www.postsharp.net/aspects/examples/performance

稍微解释一下@pasty的评论,你可以用Interception using Unity DI Container拦截你的方法调用,确实需要写更多的代码,下面是Unity拦截功能的简单示例流程图:

注意步骤3,其中代理对象实际上是返回给客户端的,因此实现了拦截行为。

【讨论】:

我可以使用免费版的 Postsharp 吗? 来自 PostSharp:诊断和线程模式库,以及 PostSharp Express 中没有的高级功能,但您可以免费试用 45 天。 作为 PostSharp 的替代方案,您可以查看 Microsoft's Patterns & Practices Unity - 可以使用属性拦截方法的执行,但您需要自己实现。 我认为 PostSharp 链接不再存在。但是,有一篇博客文章讨论了这个主题:postsharp.net/blog/post/…

以上是关于有没有办法从属性测量 C# 函数执行时间?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法测量 SQL 查询执行所需的时间而不用 Java 获取结果?

如何测量 C# 中每一行的执行时间

c#中怎样让两个函数同时执行

有没有办法编写命令以中止正在运行的函数调用?

有没有办法只在 C# 中设置一次属性

测量linux内核中函数的执行时间