An Illustrated History of Objc_msgSend
sealiesoftware.com
sealiesoftware.com
I wonder if you could do some very limited dynamic code generation to create inline caches, or just inline msgSend and allocate a cache line somewhere writable for each inlined instance.
Or is this method already a slow-path, fallback case?
Global caches perform reasonably well for many cases, and if you can exclude the long tail and keep the common cases then you'll get okay performance. Combine that with static analysts to deal with the cases you can resolve at compile time and you do okay.
I'm still a fan of PICs when used with a JIT, but I'm not sure they are always the right answer.
Thanks to Dunning-Kruger, it's quite difficult to be sure if they just can't be bothered to explain what I don't understand (maybe performance differences arise elsewhere... maybe there were far more sophisticated tricks in the modern message dispatch code than I'd come to understand... though it seemed unlikely they'd be so significant) or its the other way around.
Empirical evidence would seem to point strongly in my favour, but you'd think that'd give people some pause before making such statements.
objc_msgSend is pretty amazingly fast, and is not usually a bottleneck in code, but the inability to do things like inline method calls when the target is known at compile time is a downer.
Then there's a question of how much space you reserve for the dynamic code. Since the rest of the code is built statically you can't really shuffle things around, and have to have a hole where the code can be inserted. Make the hole too big, and you're wasting precious I-cache space. Make it too small and you're screwed. But you can't predict the future very easily to know how big the message send code might be three OS revisions down the line.
On iOS you can't write code dynamically at all in a normal process, so this all goes out the window. Your only choice there would be to generate inlining logic at compile time, and that has dire problems for binary compatibility.
objc_msgSend is pretty fast. I believe it's currently around high single-digit CPU cycles per call on the fast path.