SYSK 394: Cost of getting StackTrace and finding a StackFrame
I wanted to find out the overhead of getting the stack trace and finding a specific method in the array of stack frames. The profiled code looked like this:
private static MethodBase GetCallerMethod(string caller)
{
StackTrace st = new StackTrace(2);
return (from f in st.GetFrames() let m = f.GetMethod() where m.Name == caller select m).FirstOrDefault();
}
I used QueryThreadCycleTime API or more precise measurements
[DllImport("kernel32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool QueryThreadCycleTime(IntPtr ThreadHandle, out ulong CycleTime);
[DllImport("kernel32.dll")]
static extern IntPtr GetCurrentThread();
and here is what I found out for my test case:
- Average CPU cycles to get StackFrame[]: ~500,000
- Average CPU cycles for Linq query to find the calling method (which is usually near the top of the stack): ~70,000
- In comparison, a call to a local SQL server database to execute a stored procedure (getting a record based on primary key) on a very small database (narrow, well indexed tables with < 100 rows): ~910,000
In summary, based on my tests, the cost of finding a stack frame is in the same ballpark as making a stored procedure call on a very small (sample) well indexed database residing on the same machine.