I know this is rather old, but I was doing research on a related topic and came across this inquiry. You really have to separate the implementation from _an_ instance of implementation. While a class's source is all-inclusive, it doesn't accurately reflect the memory organization of a class and what it does. If you think of class and structure instances as holders of field data only, rather than also containing routine implementations and the class's Type instance as a holder of compiled routines, it will help.
_Most_ object implementations (_most_ meaning compiler and runtime environments coupled with whatever languages are used for generation), use something akin to a vtable. This is a table holding member addresses and referencing any associated flags and metadata. A .Net Type referring to a class or structure definition can be thought of as a wrapped view of a) the compiled methods and b) a vtable-ish implementation, providing Reflection class responses for queried members (Properties, Fields, Methods). in vtable methodology, implementations only get compiled once, per class definition, rather than per instance. Instances of classes typically don't have vtables, they just reference the vtable already defined in their corresponding Type. Class and structure instances _do_ have data values for any fields, however. So a static field only occurs once versus an instance field having a corresponding value in each instance, as Shannon said. But a static property or method has only one compiled definition, and each instance property or method also only has one compiled definition, regardless of the number of class/structure instances. Routines don't get copied to each instance, they get reused from the same place with the virtual machine equivalent of an EDI pointer set to the appropriate instances address for declared Me, this, and unprefixed references to fields.
To invoke both static and instance methods requires a table lookup followed by a dereference of that address with whatever parameter data is being passed to be pushed on the stack. I haven't found static methods to perform or be initialized any faster than instance methods, but I've been known to be wrong about thousands of things every day. That said, there _are_ some perceivable performance benefits from using a static method because a) object instantiation (as part of the process flow adding to eating up cpu) isn't required and b) memory usage is lessened (by not having an allocated object instance, such that memory management routines aren't as prevalent). The latter would only be visible at extremely large object usage (number of instances * data size). In any case, static methods are faster to code for.
But also be warned: static methods (in any environment) may also utilize class or member-local static variables making them subject to race conditions - less they implement thread safe synchronization or locking. This isn't specific to static implementations - it happens all the time for instances also. But, _this_ is often overlooked by static method implementers, and usually it is the same implementers who would use a member static variable in the first place. Some programming paradigms require member static variables because at the time of coding there were no other available avenues. Obviously, if there were no other available avenues to avoid member-static variables, there weren't any available avenues to perform method synchronization or locking either (outside of perhaps using a member static lock variable - which still has a small window of exploitation. Seemingly ancient BASIC all the way into VB6 code used this methodology a lot rather than implementing the suggested critical section api calls where available). Thread safe implementations aren't exclusively relegated to static members - the Microsoft-provided List<> class isn't even thread safe. But you really have to be wary of thread safety when using static methods - because such cases can impact the values stored…statically…causing unreliable results for the lifecycle of the Type (which is the lifecycle of the application)…rather than the lifecycle of a class instance. Do you understand the scope of impact, now? <- more important than performance considerations, yes?
No requirement exists in the CLI spec to use vtables/vtable-ish methodology. At any time, they could implement a per-class-instance copy of a compiled method implementation. I wouldn't think that would make much sense (it would bloat process memory drastically)...but stranger things have definitely happened in computing.