Static Vs Instance Method Performance C#

dotnetguts picture dotnetguts · Jun 10, 2010 · Viewed 12.6k times · Source

I have few global methods declared in public class in my ASP.NET web application.

I have habit of declaring all global methods in public class in following format

public static string MethodName(parameters) { }

I want to know how it would impact on performance point of view?

  1. Which one is better? Static Method or Non-Static Method?
  2. Reason why it is better?

http://bytes.com/topic/c-sharp/answers/231701-static-vs-non-static-function-performance#post947244 states:

because, static methods are using locks to be Thread-safe. The always do internally a Monitor.Enter() and Monitor.exit() to ensure Thread-safety.

While http://dotnetperls.com/static-method states:

static methods are normally faster to invoke on the call stack than instance methods. There are several reasons for this in the C# programming language. Instance methods actually use the 'this' instance pointer as the first parameter, so an instance method will always have that overhead. Instance methods are also implemented with the callvirt instruction in the intermediate language, which imposes a slight overhead. Please note that changing your methods to static methods is unlikely to help much on ambitious performance goals, but it can help a tiny bit and possibly lead to further reductions.

I am little confused which one to use?

Answer

SLaks picture SLaks · Jun 10, 2010

Your first link states:

Thats because static methods are using locks to be Thread-safe. The always do internally a Monitor.Enter() and Monitor.exit() to ensure Thread-safety

That is utterly, horribly, abominably wrong.


If you add [MethodImpl(MethodImplOptions.Synchronized)] to the method, that statement becomes partially true.

Adding this attribute will cause the CLR to wrap static methods inside lock(typeof(YourClass)) and instance methods inside of lock(this).

This should be avoided where possible


Your second link is correct.
Static methods are a little bit faster than instance methods, because they don't have a this parameter (thus skipping a NullReferenceException check from the callvirt instruction)