C# 中的时间基准装饰器

发布于 2024-11-08 18:04:55 字数 141 浏览 0 评论 0原文

我想(以优雅的方式)使用一些自定义方法属性,这将给我以下信息:

当我调用这样的方法 foo() 时,在某些属性中我将获得经过的时间(方法调用持续了多长时间)。

我怎样才能在 C# 中做到这一点?反思?

先感谢您。 詹姆斯

I would like (in an ELEGANT way) to use some custom method attribute which will give me this:

When I call such a method foo(), in some attribute I'll have the elapsed time (how long the method call lasted).

How can I do it in C#? Reflections?

Thank you in advance.
James

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

安稳善良 2024-11-15 18:04:55

C# 不提供开箱即用的功能。你有几个选择:

  1. 使用一些外部分析器(我认为更高版本的 VS 集成了一个)
  2. 使用 AOP 框架。例如,Postsharp 在构建后步骤中重写 IL,以基于属性引入 prolog/epilog 代码。

C# doesn't offer this out of the box. You have a few choices:

  1. Use some external profiler (I think higher editions of VS have one integrated)
  2. Use an AOP framework. For example Postsharp rewrites your IL in an after build step to introduce prolog/epilog code based on attributes.
残花月 2024-11-15 18:04:55

StopWatch 类有什么问题?我经常使用它来分析关键代码中的一般时序。如果这还不够,我会改用 ANTS(或 dotTrace)。

What's wrong with the StopWatch class? I use it regularly for profiling general timings in critical code. If that's not enough, I'll switch to ANTS (or dotTrace).

你曾走过我的故事 2024-11-15 18:04:55
Action<Action> elegantBenchmark = (body) =>
{
    var startTime = DateTime.Now;
    body();
    Console.WriteLine(DateTime.Now - startTime);
};

elegantBenchmark(DoWork);

聚苯乙烯
PostSharp 将按照您的意愿完成工作。

Action<Action> elegantBenchmark = (body) =>
{
    var startTime = DateTime.Now;
    body();
    Console.WriteLine(DateTime.Now - startTime);
};

elegantBenchmark(DoWork);

P.S.
PostSharp will do the work as you want it to be done.

唯憾梦倾城 2024-11-15 18:04:55

在 C# 中无法拦截普通的旧方法调用。您必须对 C# 代码进行后(预)处理(如使用 PostSharp)才能真正实现这一目标。

或者,您可以编写一个基准测试方法,使用 lambda 来对一段代码进行计时,但这显然不是真正的装饰器。

There is no way to intercept a plain old method call in C#. You would have to post(pre)-process your C# code (like with PostSharp) to really achieve this.

Alternatively, you could write a benchmarking method that takes a lambda to time a chunk of code, but this is obviously not a true decorator.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文