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

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

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

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

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

【问题讨论】:

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

标签: c# custom-attributes aop interception


【解决方案1】:

好吧,你需要一些代码来执行你的函数并分析你的attribute,这样它就会知道它需要在你的函数之前和之后执行一些东西(例如执行时间测量,在你的情况下) - 它可能正在使用Decorator 设计模式、ReflectionProxy 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/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-06
  • 2020-02-14
  • 2015-03-13
  • 2014-02-27
  • 1970-01-01
  • 2010-09-19
相关资源
最近更新 更多