【问题标题】:automatic logging and statistics (C# application)自动记录和统计(C# 应用程序)
【发布时间】:2026-02-06 14:35:01
【问题描述】:

我正在尝试考虑输入统计信息的最佳方式以及登录到我的程序的某种方式。 1. 有没有人写一篇关于在程序中实现统计的好文章?
2. 我可以在调用计时器的方法之前创建一个属性来测量运行时间吗?例如

class A
{
  [RunTimer]
  public void Foo()
  {
     // do stuff
  }
}

编辑
好吧,我们希望有机会在运行时控制统计信息,而不仅仅是观察开发或质量检查时。

【问题讨论】:

  • 我的代码审查问题,这里可能会有所帮助。您可以使用IDispose 接口做出一个简洁的解决方案:*.com/questions/6410569/…
  • profiler,你能指导我吗?

标签: c# logging attributes statistics


【解决方案1】:

一种选择是创建一个高阶函数,该函数将对目标函数计时并记录结果:

public static class TimingExtensions
{
    public static Func<R> Time<R>(this Func<R> target, Action<string> logger)
    {
        return delegate
        {
            System.Diagnostics.Stopwatch s = new System.Diagnostics.Stopwatch();

            s.Start();

            R value = target();

            s.Stop();

            logger("Function '" + target.Method.Name + "' elapsed ms: " + s.ElapsedMilliseconds); 

            return value;
        }; 
    }
}

但是,如果您需要进行一些繁重的性能测试,那么也有相应的框架。

【讨论】:

    【解决方案2】:
    【解决方案3】:

    Performance Counters 是你的朋友。 .NET Instrumentation Workshop 是一篇很棒的文章,它会逐步引导您完成整个过程。

    一旦你有了算法,你就可以用它们来检测各种统计数据。

    另外,可以通过两种方式在运行时控制计数器:

    • 更改您的应用是否通过配置文件开关更新性能计数器
    • 更改您通过 PerfMon 跟踪的更新

    这样,您不仅限于开发代码,还可以在生产代码中使用它们。当然,您可能不希望它们都一直运行,这就是允许配置文件切换会派上用场的地方。

    【讨论】:

      【解决方案4】:

      如果你愿意使用 PostSharp 库,那么你可以使用他们的一些 AOP-based performance counter examples.

      【讨论】: