From fe37280ff8ab84b863ca11fa9eccbbc1be28a29c Mon Sep 17 00:00:00 2001 From: zubeyralmaho Date: Mon, 2 Mar 2026 10:08:00 +0300 Subject: [PATCH] feat(yoga): Add cache miss tracking to LayoutData for hit rate metrics ## Summary Add layoutCacheMisses and measureCacheMisses fields to LayoutData struct to enable cache hit rate calculation in layout performance analysis. ## Motivation Currently Yoga tracks cache hits but not misses, making it impossible to calculate cache efficiency. This change enables: hitRate = cachedLayouts / (cachedLayouts + layoutCacheMisses) ## Changes - Added layoutCacheMisses and measureCacheMisses to LayoutData struct - Track cache misses in calculateLayoutInternal() when cache lookup fails ## Test Plan - Built Yoga library successfully - Verified first layout has cache misses - Verified second layout (same dimensions) has cache hits - Cache hit rate is now calculable --- .../ReactCommon/yoga/yoga/algorithm/CalculateLayout.cpp | 4 ++++ packages/react-native/ReactCommon/yoga/yoga/event/event.h | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/packages/react-native/ReactCommon/yoga/yoga/algorithm/CalculateLayout.cpp b/packages/react-native/ReactCommon/yoga/yoga/algorithm/CalculateLayout.cpp index 81a5f3b8a0b6..3f7416d6711f 100644 --- a/packages/react-native/ReactCommon/yoga/yoga/algorithm/CalculateLayout.cpp +++ b/packages/react-native/ReactCommon/yoga/yoga/algorithm/CalculateLayout.cpp @@ -2266,6 +2266,10 @@ bool calculateLayoutInternal( (performLayout ? layoutMarkerData.cachedLayouts : layoutMarkerData.cachedMeasures) += 1; } else { + // Track cache misses for computing hit rates + (performLayout ? layoutMarkerData.layoutCacheMisses + : layoutMarkerData.measureCacheMisses) += 1; + calculateLayoutImpl( node, availableWidth, diff --git a/packages/react-native/ReactCommon/yoga/yoga/event/event.h b/packages/react-native/ReactCommon/yoga/yoga/event/event.h index 587c1cd06367..d9f5a63bca58 100644 --- a/packages/react-native/ReactCommon/yoga/yoga/event/event.h +++ b/packages/react-native/ReactCommon/yoga/yoga/event/event.h @@ -41,6 +41,10 @@ struct LayoutData { uint32_t maxMeasureCache = 0; int cachedLayouts = 0; int cachedMeasures = 0; + // Cache misses occur when a cached result is not found and layout must be + // recalculated. Track these to compute cache hit rates. + int layoutCacheMisses = 0; + int measureCacheMisses = 0; int measureCallbacks = 0; std::array(LayoutPassReason::COUNT)> measureCallbackReasonsCount;