Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Static Vs Instance Method Performance C#

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?

like image 413
dotnetguts Avatar asked Jun 10 '10 17:06

dotnetguts


2 Answers

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)

like image 169
SLaks Avatar answered Sep 30 '22 07:09

SLaks


I tend to care very little about performance in this respect. What static methods are really useful for are enforcing functional practices. For example if you create a private static helper method in your instance class you have the piece of mind knowing that that method cannot modify the state of the instance.

like image 31
ChaosPandion Avatar answered Sep 30 '22 07:09

ChaosPandion