From 9e87813425959d9c0f6e7c7b54de787d6c6c7854 Mon Sep 17 00:00:00 2001 From: Scott Goodson Date: Fri, 5 Feb 2016 21:43:14 -0800 Subject: [PATCH] Micro-optimizations in ASDisplayNode that help reduce overhead when recursing large hierarchies. --- AsyncDisplayKit/ASDisplayNode.mm | 8 ++++++++ AsyncDisplayKit/Private/ASDisplayNodeInternal.h | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/AsyncDisplayKit/ASDisplayNode.mm b/AsyncDisplayKit/ASDisplayNode.mm index 7bd8850579..b9d1655163 100644 --- a/AsyncDisplayKit/ASDisplayNode.mm +++ b/AsyncDisplayKit/ASDisplayNode.mm @@ -1405,6 +1405,10 @@ static NSInteger incrementIfFound(NSInteger i) { { ASDisplayNodeAssertMainThread(); ASDisplayNodeAssert(!_flags.isEnteringHierarchy, @"Should not cause recursive __enterHierarchy"); + + // Profiling has shown that locking this method is benificial, so each of the property accesses don't have to lock and unlock. + ASDN::MutexLocker l(_propertyLock); + if (!self.inHierarchy && !_flags.visibilityNotificationsDisabled && ![self __selfOrParentHasVisibilityNotificationsDisabled]) { self.inHierarchy = YES; _flags.isEnteringHierarchy = YES; @@ -1427,6 +1431,10 @@ static NSInteger incrementIfFound(NSInteger i) { { ASDisplayNodeAssertMainThread(); ASDisplayNodeAssert(!_flags.isExitingHierarchy, @"Should not cause recursive __exitHierarchy"); + + // Profiling has shown that locking this method is benificial, so each of the property accesses don't have to lock and unlock. + ASDN::MutexLocker l(_propertyLock); + if (self.inHierarchy && !_flags.visibilityNotificationsDisabled && ![self __selfOrParentHasVisibilityNotificationsDisabled]) { self.inHierarchy = NO; diff --git a/AsyncDisplayKit/Private/ASDisplayNodeInternal.h b/AsyncDisplayKit/Private/ASDisplayNodeInternal.h index 6b5b4eb484..668a5fb512 100644 --- a/AsyncDisplayKit/Private/ASDisplayNodeInternal.h +++ b/AsyncDisplayKit/Private/ASDisplayNodeInternal.h @@ -43,7 +43,7 @@ FOUNDATION_EXPORT NSString * const ASRenderingEngineDidDisplayNodesScheduledBefo // Allow 2^n increments of begin disabling hierarchy notifications #define VISIBILITY_NOTIFICATIONS_DISABLED_BITS 4 -#define TIME_DISPLAYNODE_OPS (DEBUG || PROFILE) +#define TIME_DISPLAYNODE_OPS 0 // If you're using this information frequently, try: (DEBUG || PROFILE) @interface ASDisplayNode () {