使用属性进行方法分析

Mic*_*ael 3 .net profiling custom-attributes

是否可以通过.NET中的属性分析各个方法?

我目前正在尝试在大量遗留应用程序中找到一些瓶颈,这些应用程序大量使用静态方法.目前,集成框架根本不是一种选择.由于大多数调用都使用静态方法,因此接口和依赖注入不可用.攻击代码以记录诊断也不是一个可行的解决方案.

我知道市场上有一些分析工具,但它们目前不在预算范围内.理想情况下,我将能够创建自己的自定义属性,该属性将记录有关方法输入和方法退出的一些基本信息.我从来没有真正使用自定义属性,所以任何洞察甚至是否可能这将是值得赞赏的.

如果可能的话,我想通过配置文件启用分析.这将通过单元和集成测试支持分析.

LBu*_*kin 6

您无法使用属性来执行您的操作.但是,你有一些选择:

首先,许多分析工具(如RedGate ANTS)相对便宜(200美元至300美元),易于使用,大多数提供几周的免费评估期 - 所以你可以看看他们是否会给你电梯在你决定是否购买之前,你现在需要.此外,.NET CLR分析器可以免费下载.

如果那是不可能的,PostSharp可能是将这种逻辑编织到代码中的最简单方法.

最后,如果由于某种原因无法使用PostSharp并且您愿意为代码添加属性,那么您也可以使用块的形式为每个方法添加一个简单的检测块:

public void SomeMethodToProfile()
{
    // following line collects information about current executing method
    // and logs it when the metric tracker is disposed of
    using(MetricTracker.Track(MethodBase.GetCurrentMethod()))
    { 
        // original code here...
    }
}
Run Code Online (Sandbox Code Playgroud)

典型的MetricTracker实现看起来像这样:

public sealed class MetricTracker : IDisposable
{
    private readonly string m_MethodName;
    private readonly Stopwatch m_Stopwatch;

    private MetricTracker( string methodName ) 
       { m_MethodName = methodName; m_Stopwatch = Stopwatch.StartNew(); }

    void IDisposable.Dispose()
       { m_Stopwatch.Stop(); LogToSomewhere(); }

    private void LogToSomewhere()
       { /* supply your own implementation here...*/ }

    public static MetricTracker Track( MethodBase mb )
       { return new MetricTracker( mb.Name ); }
}
Run Code Online (Sandbox Code Playgroud)