Before implementing convenience features or making architectural decisions, carefully evaluate their performance implications and hidden costs. Consider factors like method call overhead, automatic behavior frequency, and resource utilization patterns.

Key considerations:

Example from layout systems:

// Instead of automatic dirty detection on every layout:
// YGSize newSize = YGMeasureView(node, 0, YGMeasureModeUndefined, 0, YGMeasureModeUndefined);
// Consider the cost: "every leaf node is going to be measured during every single layout call"

// Prefer explicit control when performance matters:
@interface YGLayout ()
@property (nonatomic, assign, readonly) YGNodeRef node; // ivar reduces msgSends
@end

Always benchmark assumptions and consider the cumulative impact of seemingly small optimizations, especially in performance-critical paths like layout and rendering.