On Fri, Mar 12, 2010 at 5:41 PM, Gwynne Raskind <gwy...@darkrainfall.org> wrote: > On Mar 12, 2010, at 4:52 PM, Peter Ammon wrote: >>> While profiling a project I'm working on, I found that while most of my >>> time was being spent in glFlush() (which is completely expected for an >>> OpenGL-based game), a non-trivial amount of time is being spent in dozens >>> of KVO internal methods and functions. Most especially, I noticed that KVO >>> (or possibly the KVC beneath it) makes heavy use of NSInvocation-based >>> forwarding, which is known to be the slowest possible code path for message >>> dispatch. >> I think KVO only uses NSInvocation when setting or getting non-standard >> aggregate types. So if your property is any primitive C type, any ObjC >> object, or an NSPoint, NSRect, NSRange, or NSSize, then it will not use >> NSInvocation. If it's a custom struct it will. Does that seem plausible >> based on what your property types are? >> >> If not, it would be helpful to post a backtrace for the call to >> +[NSInvocation invocationWithMethodSignature:], so we can figure out what's >> happening. > > > You're right; the specific call that's causing the worst speed issues is > returning a property typed with this structure: > > typedef struct { int32_t x, y; } IntegerPoint; > > It's not necessarily feasible to switch this to an NSPoint; it means digging > up every point in the code that relies on signed 32-bit integer math and > doing manual typecasting (or calling lround()) away from CGFloat. If there's > no way to cheat KVO into doing this sanely, I'll resign myself to it, but I > kinda hope there's something a little less annoying. > > (It's even more annoying because it *was* an NSPoint in a much earlier > iteration of the code and I changed it because it simplified the code in two > dozen places, and because the property in question is integer and doesn't > need the slower floating-point instructions to manipulate it.)
Implement +automaticallyNotifiesObserversForKey: to return NO for that key, then call will/didChangeValueForKey: yourself in the setter. That will avoid the expensive automatic KVO machinery, while allowing you to leave everything else untouched. Mike _______________________________________________ Cocoa-dev mailing list (Cocoa-dev@lists.apple.com) Please do not post admin requests or moderator comments to the list. Contact the moderators at cocoa-dev-admins(at)lists.apple.com Help/Unsubscribe/Update your Subscription: http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com This email sent to arch...@mail-archive.com