How performant is StackFrame?

前端 未结 7 1220
鱼传尺愫
鱼传尺愫 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:42

    From the MSDN documentation, it seems like StackFrames are being created all the time:

    A StackFrame is created and pushed on the call stack for every function call made during the execution of a thread. The stack frame always includes MethodBase information, and optionally includes file name, line number, and column number information.

    The constructor new StackFrame(1) you'd call would do this:

    private void BuildStackFrame(int skipFrames, bool fNeedFileInfo)
    {
        StackFrameHelper sfh = new StackFrameHelper(fNeedFileInfo, null);
        StackTrace.GetStackFramesInternal(sfh, 0, null);
        int numberOfFrames = sfh.GetNumberOfFrames();
        skipFrames += StackTrace.CalculateFramesToSkip(sfh, numberOfFrames);
        if ((numberOfFrames - skipFrames) > 0)
        {
            this.method = sfh.GetMethodBase(skipFrames);
            this.offset = sfh.GetOffset(skipFrames);
            this.ILOffset = sfh.GetILOffset(skipFrames);
            if (fNeedFileInfo)
            {
                this.strFileName = sfh.GetFilename(skipFrames);
                this.iLineNumber = sfh.GetLineNumber(skipFrames);
                this.iColumnNumber = sfh.GetColumnNumber(skipFrames);
            }
        }
    }
    

    GetStackFramesInternal is an external method. CalculateFramesToSkip has a loop that operates exactly once, since you specified only 1 frame. Everything else looks pretty quick.

    Have you tried measuring how long it would take to create, say, 1 million of them?

    0 讨论(0)
提交回复
热议问题