比较2方法的性能

时间:2013-12-03 10:32:56

标签: .net visual-studio-2010 performance-testing

我有以下内容:

public class Logger
{
    public static void LogStartMethod(MethodBase method)
    {
        Console.WriteLine("{0} Method '{1}' started", DateTime.Now, method.Name);
    }

    public static void LogStartMethod1()
    {
        StackTrace stackTrace = new StackTrace();
        MethodBase method = stackTrace.GetFrame(0).GetMethod();
        LogStartMethod(method);
    }

    public static void LogStartMethod2()
    {
        MethodBase method = MethodBase.GetCurrentMethod();
        LogStartMethod(method);
    }
}

我想确定LogStartMethod1或LogStartMethod2之间性能最佳的方法......

让我们对具体方法的作用进行抽象,但是有一个工具(在线或Visual Studio加载项)能够比较两种方法的性能吗?

我现在有很多商业性能分析器...我们应该支付或使用Visual Studio Ultimate来为整个解决方案提供性能工具....

我想比较两种方法,一切都是......

4 个答案:

答案 0 :(得分:4)

StopWatch课程可以衡量速度 在测试之前调用StopWatch.Start,之后调用StopWatch.Stop

请记住在发布模式下运行速度测试,而不是调试模式。

答案 1 :(得分:2)

我现在可以告诉你,任何组装堆栈跟踪的东西都会慢于类似的(tm)代码。

获取调用方法名称的最快方法是使用System.Runtime.CompilerServices.CallerMemberName属性。编译代码时,编译会将方法名称作为字符串文字插入。它非常快,但需要C#.5

这是我经过试验和测试的性能代码,其中包含示例方法以演示此问题:

class Program
{
    static void Main(string[] args)
    {
        Dictionary<string, Action> tasks = new Dictionary<string, Action>();
        List<string> results = new List<string>();

        tasks.Add("Task 1", Task1);
        tasks.Add("Task 2", Task2);
        tasks.Add("Task 3", Task3);

        string input = "This is a sample string";
        int count = 9999;

        Console.Write("Warming up...");
        foreach (var item in tasks.Values)
        {
            item();
        }
        Console.WriteLine("Done.");

        Console.WriteLine();
        Console.WriteLine();

        foreach (var item in tasks)
        {
            var time = RunPerf(item.Key, count, item.Value);
            results.Add(string.Format("{0}\t\t{1}", item.Key, time));
        }

        Console.WriteLine();
        Console.WriteLine("RESULTS");
        foreach (var item in results)
        {
            Console.WriteLine(item);
        }

        Console.ReadLine();
    }

    public static void Task1()
    {
        StackTrace stackTrace = new StackTrace();
        MethodBase method = stackTrace.GetFrame(0).GetMethod();
        LogStartMethod(method);
    }

    public static void Task2()
    {
        MethodBase method = MethodBase.GetCurrentMethod();
        LogStartMethod(method);
    }

    public static void Task3()
    {
        LogStartMethod();
    }

    public static void LogStartMethod(MethodBase method)
    {
        Console.WriteLine("{0} Method '{1}' started", DateTime.Now, method.Name);
    }
    public static void LogStartMethod([System.Runtime.CompilerServices.CallerMemberName]string methodName = null)
    {
        Console.WriteLine("{0} Method '{1}' started", DateTime.Now, methodName);
    }

    static TimeSpan RunPerf(string name, int count, Action action)
    {
        var sw = new System.Diagnostics.Stopwatch();
        Console.WriteLine(string.Format("Starting perf for {0}. {1} times", name, count));

        sw.Start();
        for (int i = 0; i < count; i++)
        {
            action();
        }
        sw.Stop();
        Console.WriteLine(string.Format("{0} completed in {1}", name, sw.Elapsed));

        return sw.Elapsed;
    }
}

注意。请务必在发布中运行此代码。它需要 C#5。我建议使用.net 4.5项目

RESULTS
Task 1          00:00:00.7226149
Task 2          00:00:00.5001454
Task 3          00:00:00.4690296

答案 2 :(得分:1)

VS 12 Ultimate:查看菜单项ANALYZE & Start Performance Analysis ---它提供了有趣的反馈,不仅与2种方法相关 - 本周已经尝试过,结果对于当前状态和未来都非常有成果一些编码问题的方向。

答案 3 :(得分:1)

我建议在两个解决方案上使用 Performance Counters ,一个使用方法LogStartMethod1,另一个使用LogStartMethod2。连续几分钟调用此方法,并观察% Processor Time.NET CLR Memory等计数器的运行过程,当然还要测量方法执行的总数。然后,您将看到时间处理差异以及CPU和内存消耗的差异。