How performant is StackFrame?

前端 未结 7 1218
鱼传尺愫
鱼传尺愫 2020-12-01 02:18

I am considering using something like StackFrame stackFrame = new StackFrame(1) to log the executing method, but I don\'t know about its performance implication

7条回答
  •  [愿得一人]
    2020-12-01 02:36

    A quick and naive test indicates that for performance-sensitive code, yes, you want to pay attention to this:

    Don't generate 100K frames: 3ms

    Generate 100K frames: 1805ms

    About 20 microseconds per generated frame, on my machine. Not a lot, but a measurable difference over a large number of iterations.

    Speaking to your later questions ("Should I disable StackFrame generation in my application?"), I'd suggest you analyze your application, do performance tests like the one I've done here, and see if the performance difference amounts to anything with your workload.

    using System;
    using System.Diagnostics;
    
    namespace ConsoleApplication
    {
        class Program
        {
            static bool generateFrame;
    
            static void Main(string[] args)
            {
                Stopwatch sw;
    
                // warm up
                for (int i = 0; i < 100000; i++)
                {
                    CallA();
                }
    
                // call 100K times; no stackframes
                sw = Stopwatch.StartNew();
                for (int i = 0; i < 100000; i++)
                {
                    CallA();
                }
                sw.Stop();
                Console.WriteLine("Don't generate 100K frames: {0}ms"
                                     , sw.ElapsedMilliseconds);
    
                // call 100K times; generate stackframes
                generateFrame = true;
                sw = Stopwatch.StartNew();
                for (int i = 0; i < 100000; i++)
                {
                    CallA();
                }
                Console.WriteLine("Generate 100K frames: {0}ms"
                               , sw.ElapsedMilliseconds);
    
                Console.ReadKey();
            }
    
            private static void CallA()
            {
                CallB();
            }
    
            private static void CallB()
            {
                CallC();
            }
    
            private static void CallC()
            {
                if (generateFrame)
                {
                    StackFrame stackFrame = new StackFrame(1);
                }
            }
        }
    }
    

提交回复
热议问题