是否有可能简单独的方法通过的属性。净?

目前我正在试图找到一些瓶颈中的一大遗产应用程序,使得大量使用静态的方法。整合框架是根本不是一个选项的时刻。由于大多数的呼吁,使用的是静态的方法、接口和依赖关系注入不可用。黑客入侵代码登录诊断,不是一个可行的解决办法。

我知道,有一些分析工具在市场上,但他们目前的外部预算。理想情况下,我将能够创造我自己的定义特性,将会记录的一些基本信息的方法的条目和方法出口。我从来没有真正的工作用定义属性的任何深入了解如果这是甚至有可能将不胜感激。

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

有帮助吗?

解决方案

你不能使用的属性为你在做什么。但是,你有一些选择:

第一,许多剖析工具(如 展鹏蚂蚁)是比较便宜的(200美元-300美元),容易使用,并最提供免费的评价周期的几个星期-所以你可以看到,如果他们会给你提升你现在需要的,然后再决定是否购买。还有, .净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...
    }
}

一个典型的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 ); }
}

其他提示

你可以用 PostSharp 做一些织,基本上转向:

[Profiled]
public void Foo()
{
     DoSomeStuff();
}

public void Foo()
{
    Stopwatch sw = Stopwatch.StartNew();
    try
    {
        DoSomeStuff();
    }
    finally
    {
        sw.Stop();
        ProfileData.AddSample("Foo", sw.Elapsed);
    }
}

事实上,看PostSharp文件,应能够使用 直布罗陀 (与PostSharp)为这个,如果你可以负担它。否则你可能会花费一天或因此得到挂的PostSharp,但它仍然可能非常值得的。

注意,我知道你说你不能买得起,以便将框架变成你的代码,但是它不喜欢你真的会被"融合"这么多,因为越来越PostSharp运行一些后编制变革对你的代码。

我一直在寻找的东西非常类似的描述。我不能找到这样一个框架,使我滚是我自己的。我应该注意,这是 非常简单, 但有时候简单的很好!

我将它描述为基准符合单元的测试。这个概念是分离的章节的代码,以便测量或比较的速度。

一个典型的例子的属性使用情况将如下所示:

[ProfileClass]
public class ForEachLoopBenchmarks
{
    [ProfileMethod]
    public void ForLoopBenchmark()
    {
        List<int> list = GetNumberList();

        for (int i = 0; i < list.Count; i++)
        {
        }
    }

    [ProfileMethod]
    public void ForEachLoopBenchmark()
    {
        List<int> list = GetNumberList();

        foreach (int i in list)
        {
        }
    }

    private List<int> GetNumberList()
    {
        List<int> list = new List<int>();
        for (int i = 0; i < 1000; i++)
        {
            list.Add(i);
        }
        return list;
    }
}

然后,您可以创建一个控制台应用程序,并粘贴以下代码进入 方法,并添加一个参考大会,包含前所述类是装饰用的属性。执行时间为每种方法(运行的1000倍)将被输出到控制台。

class Program
{
    static void Main(string[] args)
    {
        ProfileRunner rp = new ProfileRunner();
        rp.Run();
    }
}

控制台输出看起来如下:

console output

你需要添加参照的 pUnit.dll 控制台应用程序和类图书馆,其中包含的方法标的属性。

你可以把这作为一个包裹 Nuget 在这里,.

Nuget命令: 午安装包尼

如果你会而不是完整的源代码,你可以找到它的 在这里,.

我根据该方法的实际措施的执行时间在这个问题: https://stackoverflow.com/a/1048708/1139752

我的执行情况的更详细如下 博客.

还有 一些 免费的剖析工具,它可能是值得一看。

我做性能调整。 所有我需要的是这种技术。 这不是一个大问题。

它基于一个简单的想法。如果你在等待很长时间比有必要,这意味着程序的一部分也是等待很长时间比有必要,为什么不真正需要的工作要做。

它是怎样在等什么?几乎总是在一个电话网站上的呼叫堆。

所以如果你只是暂停,它,而你却在等待,看看叫堆的,你会看到什么在等待,而如果这不是真的有必要(而这通常不是),你会看到为什么。

不信任只有一个样做了几次。任何东西,显示了在多个堆栈样的东西,如果你可以做些什么,将会节省很多时间。

所以你看,这不是约定时功能或数多少次他们都叫。这是关于滴的程序未经宣布,几次,并要求它在做什么和为什么。如果有什么浪费了80%(或20%或任何)的时间,则有80%的周期将在国家不真正有必要的,因此只是在他们看一看。你不需要精确的测量。

它的工作与大问题。它也适用于小问题。如果你所做的整件事多于一次,作为该程序得到快速的、小小的问题变得相对更大和更容易找到。

你不可能实现这个通过的属性,除非你要用方面向编程经喜欢的东西 PostSharp 要实现这一点。

你可以把有条件的逻辑,在那里,根据定义(可能落在一个建立结构),但是。这可能打开或关闭你的记录时间取决于你目前的编制设置。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top