| Index: Source/core/css/resolver/StyleResolver.cpp
|
| diff --git a/Source/core/css/resolver/StyleResolver.cpp b/Source/core/css/resolver/StyleResolver.cpp
|
| index ccebb164bf1c8bcac00ece93c087f0efe3d6ec53..b4898fdf5436dd931364091b5cebcc5c3a36c5a2 100644
|
| --- a/Source/core/css/resolver/StyleResolver.cpp
|
| +++ b/Source/core/css/resolver/StyleResolver.cpp
|
| @@ -63,6 +63,7 @@
|
| #include "core/css/resolver/SharedStyleFinder.h"
|
| #include "core/css/resolver/StyleAdjuster.h"
|
| #include "core/css/resolver/StyleBuilder.h"
|
| +#include "core/css/resolver/StyleResolverStats.h"
|
| #include "core/css/resolver/ViewportStyleResolver.h"
|
| #include "core/dom/CSSSelectorWatch.h"
|
| #include "core/dom/NodeRenderStyle.h"
|
| @@ -126,6 +127,7 @@ StyleResolver::StyleResolver(Document& document)
|
| , m_fontSelector(CSSFontSelector::create(&document))
|
| , m_viewportStyleResolver(ViewportStyleResolver::create(&document))
|
| , m_styleResourceLoader(document.fetcher())
|
| + , m_styleResolverStatsSequence(0)
|
| {
|
| Element* root = document.documentElement();
|
|
|
| @@ -313,6 +315,7 @@ void StyleResolver::addToStyleSharingList(Element& element)
|
| // otherwise we could leave stale pointers in there.
|
| if (!document().inStyleRecalc())
|
| return;
|
| + INCREMENT_STYLE_STATS_COUNTER(*this, sharedStyleCandidates);
|
| if (m_styleSharingList.size() >= styleSharingListSize)
|
| m_styleSharingList.remove(--m_styleSharingList.end());
|
| m_styleSharingList.prepend(&element);
|
| @@ -1214,7 +1217,8 @@ void StyleResolver::applyMatchedProperties(StyleResolverState& state, const Matc
|
| {
|
| const Element* element = state.element();
|
| ASSERT(element);
|
| - STYLE_STATS_ADD_MATCHED_PROPERTIES_SEARCH();
|
| +
|
| + INCREMENT_STYLE_STATS_COUNTER(*this, matchedPropertyApply);
|
|
|
| unsigned cacheHash = matchResult.isCacheable ? computeMatchedPropertiesHash(matchResult.matchedProperties.data(), matchResult.matchedProperties.size()) : 0;
|
| bool applyInheritedOnly = false;
|
| @@ -1222,13 +1226,13 @@ void StyleResolver::applyMatchedProperties(StyleResolverState& state, const Matc
|
|
|
| if (cacheHash && (cachedMatchedProperties = m_matchedPropertiesCache.find(cacheHash, state, matchResult))
|
| && MatchedPropertiesCache::isCacheable(element, state.style(), state.parentStyle())) {
|
| - STYLE_STATS_ADD_MATCHED_PROPERTIES_HIT();
|
| + INCREMENT_STYLE_STATS_COUNTER(*this, matchedPropertyCacheHit);
|
| // We can build up the style by copying non-inherited properties from an earlier style object built using the same exact
|
| // style declarations. We then only need to apply the inherited properties, if any, as their values can depend on the
|
| // element context. This is fast and saves memory by reusing the style data structures.
|
| state.style()->copyNonInheritedFrom(cachedMatchedProperties->renderStyle.get());
|
| if (state.parentStyle()->inheritedDataShared(cachedMatchedProperties->parentRenderStyle.get()) && !isAtShadowBoundary(element)) {
|
| - STYLE_STATS_ADD_MATCHED_PROPERTIES_HIT_SHARED_INHERITED();
|
| + INCREMENT_STYLE_STATS_COUNTER(*this, matchedPropertyCacheInheritedHit);
|
|
|
| EInsideLink linkStatus = state.style()->insideLink();
|
| // If the cache item parent style has identical inherited properties to the current parent style then the
|
| @@ -1329,16 +1333,11 @@ void StyleResolver::applyMatchedProperties(StyleResolverState& state, const Matc
|
|
|
| ASSERT(!state.fontBuilder().fontDirty());
|
|
|
| -#ifdef STYLE_STATS
|
| - if (!cachedMatchedProperties)
|
| - STYLE_STATS_ADD_MATCHED_PROPERTIES_TO_CACHE();
|
| -#endif
|
| -
|
| if (cachedMatchedProperties || !cacheHash)
|
| return;
|
| if (!MatchedPropertiesCache::isCacheable(element, state.style(), state.parentStyle()))
|
| return;
|
| - STYLE_STATS_ADD_MATCHED_PROPERTIES_ENTERED_INTO_CACHE();
|
| + INCREMENT_STYLE_STATS_COUNTER(*this, matchedPropertyCacheAdded);
|
| m_matchedPropertiesCache.add(state.style(), state.parentStyle(), cacheHash, matchResult);
|
| }
|
|
|
| @@ -1346,6 +1345,35 @@ CSSPropertyValue::CSSPropertyValue(CSSPropertyID id, const StylePropertySet& pro
|
| : property(id), value(propertySet.getPropertyCSSValue(id).get())
|
| { }
|
|
|
| +void StyleResolver::enableStats(StatsReportType reportType)
|
| +{
|
| + if (m_styleResolverStats)
|
| + return;
|
| + m_styleResolverStats = StyleResolverStats::create();
|
| + m_styleResolverStatsTotals = StyleResolverStats::create();
|
| + if (reportType == ReportSlowStats) {
|
| + m_styleResolverStats->printMissedCandidateCount = true;
|
| + m_styleResolverStatsTotals->printMissedCandidateCount = true;
|
| + }
|
| +}
|
| +
|
| +void StyleResolver::disableStats()
|
| +{
|
| + m_styleResolverStatsSequence = 0;
|
| + m_styleResolverStats.clear();
|
| + m_styleResolverStatsTotals.clear();
|
| +}
|
| +
|
| +void StyleResolver::printStats()
|
| +{
|
| + if (!m_styleResolverStats)
|
| + return;
|
| + fprintf(stderr, "=== Style Resolver Stats (resolve #%u) (%s) ===\n", ++m_styleResolverStatsSequence, m_document.url().string().utf8().data());
|
| + fprintf(stderr, "%s\n", m_styleResolverStats->report().utf8().data());
|
| + fprintf(stderr, "== Totals ==\n");
|
| + fprintf(stderr, "%s\n", m_styleResolverStatsTotals->report().utf8().data());
|
| +}
|
| +
|
| void StyleResolver::applyPropertiesToStyle(const CSSPropertyValue* properties, size_t count, RenderStyle* style)
|
| {
|
| StyleResolverState state(document(), document().documentElement(), style);
|
| @@ -1381,39 +1409,4 @@ bool StyleResolver::affectedByViewportChange() const
|
| return false;
|
| }
|
|
|
| -#ifdef STYLE_STATS
|
| -StyleSharingStats StyleResolver::m_styleSharingStats;
|
| -
|
| -static void printStyleStats(unsigned searches, unsigned elementsEligibleForSharing, unsigned stylesShared, unsigned searchFoundSiblingForSharing, unsigned searchesMissedSharing,
|
| - unsigned matchedPropertiesSearches, unsigned matchedPropertiesHit, unsigned matchedPropertiesSharedInheritedHit, unsigned matchedPropertiesToCache, unsigned matchedPropertiesEnteredIntoCache)
|
| -{
|
| - double percentOfElementsSharingStyle = (stylesShared * 100.0) / searches;
|
| - double percentOfNodesEligibleForSharing = (elementsEligibleForSharing * 100.0) / searches;
|
| - double percentOfEligibleSharingRelativesFound = (searchFoundSiblingForSharing * 100.0) / searches;
|
| - double percentOfMatchedPropertiesHit = (matchedPropertiesHit * 100.0) / matchedPropertiesSearches;
|
| - double percentOfMatchedPropertiesSharedInheritedHit = (matchedPropertiesSharedInheritedHit * 100.0) / matchedPropertiesSearches;
|
| - double percentOfMatchedPropertiesEnteredIntoCache = (matchedPropertiesEnteredIntoCache * 100.0) / matchedPropertiesToCache;
|
| -
|
| - fprintf(stderr, "%u elements checked, %u were eligible for style sharing (%.2f%%).\n", searches, elementsEligibleForSharing, percentOfNodesEligibleForSharing);
|
| - fprintf(stderr, "%u elements were found to share with, %u were possible (%.2f%%).\n", searchFoundSiblingForSharing, searchesMissedSharing + searchFoundSiblingForSharing, percentOfEligibleSharingRelativesFound);
|
| - fprintf(stderr, "%u styles were actually shared once sibling and attribute rules were considered (%.2f%%).\n", stylesShared, percentOfElementsSharingStyle);
|
| - fprintf(stderr, "%u/%u (%.2f%%) matched property lookups hit the cache.\n", matchedPropertiesHit, matchedPropertiesSearches, percentOfMatchedPropertiesHit);
|
| - fprintf(stderr, "%u/%u (%.2f%%) matched property lookups hit the cache and shared inherited data.\n", matchedPropertiesSharedInheritedHit, matchedPropertiesSearches, percentOfMatchedPropertiesSharedInheritedHit);
|
| - fprintf(stderr, "%u/%u (%.2f%%) matched properties were cacheable\n", matchedPropertiesEnteredIntoCache, matchedPropertiesToCache, percentOfMatchedPropertiesEnteredIntoCache);
|
| -}
|
| -
|
| -void StyleSharingStats::printStats() const
|
| -{
|
| - fprintf(stderr, "--------------------------------------------------------------------------------\n");
|
| - fprintf(stderr, "This recalc style:\n");
|
| - printStyleStats(m_searches, m_elementsEligibleForSharing, m_stylesShared, m_searchFoundSiblingForSharing, m_searchesMissedSharing,
|
| - m_matchedPropertiesSearches, m_matchedPropertiesHit, m_matchedPropertiesSharedInheritedHit, m_matchedPropertiesToCache, m_matchedPropertiesEnteredIntoCache);
|
| -
|
| - fprintf(stderr, "Total:\n");
|
| - printStyleStats(m_totalSearches, m_totalElementsEligibleForSharing, m_totalStylesShared, m_totalSearchFoundSiblingForSharing, m_totalSearchesMissedSharing,
|
| - m_totalMatchedPropertiesSearches, m_totalMatchedPropertiesHit, m_totalMatchedPropertiesSharedInheritedHit, m_totalMatchedPropertiesToCache, m_totalMatchedPropertiesEnteredIntoCache);
|
| - fprintf(stderr, "--------------------------------------------------------------------------------\n");
|
| -}
|
| -#endif
|
| -
|
| } // namespace WebCore
|
|
|