views:

937

answers:

4

Does C# inline access to properties? I'm aware of the 32 byte(instruction?) limit on the JIT for inlining, but will it inline properties or just pure method calls?

+14  A: 

It's up to the JIT (the C# compiler doesn't do any inlining as far as I'm aware), but I believe the JIT will inline trivial properties in most cases.

Note that it won't inline members of types deriving from MarshalByRefObject which includes System.Windows.Forms.Control (via System.ComponentModel.Component).

I've also seen double fields end up being less efficient when accessed via properties - it could be that there are some subtleties around that (due to register use etc).

Also note that the 64-bit and 32-bit JITs are different, including their treatment of what gets inlined.

EDIT: I've just found a 2004 blog entry by David Notario with some more information. However, that was before 2.0 shipped - I wouldn't be surprised to see that at least some of it had changed now. Might be of interest anyway.

EDIT: Another question referred to a 2008 Vance Morrison blog entry which gives more information. Interesting stuff.

Jon Skeet
Worth noting a property is a wrapper around one or two (get_Name, set_Name) functions. So property inlining is a minimal extension over function inlining.
Richard
+6  A: 

A property access is just a pure method call. There is no difference in the IL the compiler emits for a property access and for a method call with a similar signature, which sort of answers your question.

Anton Tykhyy
While I agree with the general principle, there *is* a difference in IL at the *property* side... the JIT can certainly "know" that what's being called is a property member, so it *could* decide not to JIT based on that information. It would be quite odd to do so though, IMO.
Jon Skeet
Yes, accessor methods are marked with `specialname` flag, and their names are standardized. OTOH, methods which are to receive special treatment from CLR (like constructors) are marked with `rtspecialname`, so treating accessors differently would be against the spirit of CLI/CLR standard.
Anton Tykhyy
+2  A: 

It took me a while to figure out that in Visual Studio you can view the disassembly of managed code, after the JIT compiles it.

So why not create a class with a very simple accessor property, run it in release mode, set a breakpoint, and see what the disassembly says?

zildjohn01
Why don't you tell us how to do that if (as you say) took you a while to figure that out?
David Pokluda
Just step or break into the code and open the Disassembly window.
Anton Tykhyy
If you run release mode code under the debugger, running it under the deugger is likely to disable JIT optimizations! Instead you need to start it without the debugger, let it JIT, and then use the debugger to attach to the already-running process (and *then* open the disassembly window).
ChrisW
A: 

I posted a similar question recently:

http://stackoverflow.com/questions/632831/why-are-public-fields-faster-than-properties

The issue with mine was that a public field was faster than a property because I'm running 64-bit Vista and the JIT compiled my code to 64-bit as well, and my properties were not in-lined. Forcing the project to compile for x86 did in-line the property and there was no speed difference between the property and the public field.

So, the C# 32-bit JIT does in-line properties, the 64-bit doesn't, nor any other non-static methods.

JulianR