Chromium Blog

Chromium Blog

News and developments from the open source browser project

Digging for performance gold: finding hidden performance wins

Thursday, April 22, 2021
chrome://tracing view of a 2 seconds Jank on AutocompleteController::UpdateResult() on an otherwise healthy machine


We have a culprit! Let’s optimize AutocompleteController? No! We don’t know why yet: keep assuming ignorance!

By augmenting BackgroundTracing with stack sampling, we were able to find a recurring stack under stalled AutoComplete events:

    RegEnumValueW

    RegEnumValueWStub

    base::win::RegistryValueIterator::Read()

    gfx::`anonymous namespace\'::CachedFontLinkSettings::GetLinkedFonts

    gfx::internal::LinkedFontsIterator::GetLinkedFonts()

    gfx::internal::LinkedFontsIterator::NextFont(gfx::Font *)

    gfx::GetFallbackFonts(gfx::Font const &)

    gfx::RenderTextHarfBuzz::ShapeRuns(...)

    gfx::RenderTextHarfBuzz::ItemizeAndShapeText(...)

    gfx::RenderTextHarfBuzz::EnsureLayoutRunList()

    gfx::RenderTextHarfBuzz::EnsureLayout()

    gfx::RenderTextHarfBuzz::GetStringSizeF()

    gfx::RenderTextHarfBuzz::GetStringSize()

    OmniboxTextView::CalculatePreferredSize()

    OmniboxTextView::ReapplyStyling()

    OmniboxTextView::SetText...)

    OmniboxResultView::Invalidate()

    OmniboxResultView::SetMatch(AutocompleteMatch const &)

    OmniboxPopupContentsView::UpdatePopupAppearance()

    OmniboxPopupModel::OnResultChanged()

    OmniboxEditModel::OnCurrentMatchChanged()

    OmniboxController::OnResultChanged(bool)

    AutocompleteController::UpdateResult(bool,bool)

    AutocompleteController::Start(AutocompleteInput const &)

    (...)


Ah ha! Autocomplete is not at fault. Time to optimize GetFallbackFonts()?! But wait… Why is GetFallbackFonts() even called in the first place?

And before we figure that out, how do we know this is the #1 root cause of our overall long-tail performance issue? We’ve only looked at one trace so far after all...



The Measurement Conundrum

The metrics tell us how many users are affected and how bad it is, but they do not highlight the root cause.

Slow Reports tell us what the problem is for a specific user but not how many users are affected. And while we can query our corpus of Slow Report traces, it comes with inherent biases that make it impossible to correlate 1:1 with metrics. For instance, because Chrome only reports the first instance of bad performance per-session and only for users of the Canary/Dev channel, there’s both a startup and a population bias.

This is the measurement conundrum. The more actionability (data) a tool provides, the fewer scenarios it captures and the more bias it incurs. Depth vs. breadth.

Tools that attempt to do both sit somewhere in the middle, where they use aggregation over a large dataset and risk showing aggregate results based on flawed input (e.g. circular buffer tracing having dropped the interesting portion and contributing to a biased aggregate).

DirectWrite; however, DirectWrite was added in Windows 7, when Chrome still supported Windows XP. Therefore the GetFallbackFont() logic was forced to stick to a less reliable



Still not zero though, and still seeing instances of the aforementioned AutoComplete issue in our Slow Reports. Keep digging. DirectWrite’s GetFallbackFont() failing was unexpected, but since Slow Reports are anonymized, no user-generated strings can be uploaded -- and therefore, finding which codepoints were problematic was tricky. We teamed up with our privacy experts to instrument Unicode Block and Script of text blocks going through segmentation logic which incorrectly broke down these two
99th percentile of # of unresponsive 100ms intervals over a 30 seconds sample


Posted by Gabriel Charette 🀸🏼 and Etienne Bergeron πŸ•΅πŸ», Chrome Software Engineers

Data source for all statistics: Real-world data anonymously aggregated from Chrome clients.
Share on Twitter Share on Facebook
Google
Labels: emoji , fonts , jank , long-tail , performance , the fast and the curious , tracing
  

Labels


  • $200K 1
  • 10th birthday 4
  • abusive ads 1
  • abusive notifications 2
  • accessibility 3
  • ad blockers 1
  • ad blocking 2
  • advanced capabilities 1
  • android 2
  • anti abuse 1
  • anti-deception 1
  • background periodic sync 1
  • badging 1
  • benchmarks 1
  • beta 83
  • better ads standards 1
  • billing 1
  • birthday 4
  • blink 2
  • browser 2
  • browser interoperability 1
  • bundles 1
  • capabilities 6
  • capable web 1
  • cds 1
  • cds18 2
  • cds2018 1
  • chrome 35
  • chrome 81 1
  • chrome 83 2
  • chrome 84 2
  • chrome ads 1
  • chrome apps 5
  • Chrome dev 1
  • chrome dev summit 1
  • chrome dev summit 2018 1
  • chrome dev summit 2019 1
  • chrome developer 1
  • Chrome Developer Center 1
  • chrome developer summit 1
  • chrome devtools 1
  • Chrome extension 1
  • chrome extensions 3
  • Chrome Frame 1
  • Chrome lite 1
  • Chrome on Android 2
  • chrome on ios 1
  • Chrome on Mac 1
  • Chrome OS 1
  • chrome privacy 4
  • chrome releases 1
  • chrome security 10
  • chrome web store 32
  • chromedevtools 1
  • chromeframe 3
  • chromeos 4
  • chromeos.dev 1
  • chromium 9
  • cloud print 1
  • coalition 1
  • coalition for better ads 1
  • contact picker 1
  • content indexing 1
  • cookies 1
  • core web vitals 2
  • csrf 1
  • css 1
  • cumulative layout shift 1
  • custom tabs 1
  • dart 8
  • dashboard 1
  • Data Saver 3
  • Data saver desktop extension 1
  • day 2 1
  • deceptive installation 1
  • declarative net request api 1
  • design 2
  • developer dashboard 1
  • Developer Program Policy 2
  • developer website 1
  • devtools 13
  • digital event 1
  • discoverability 1
  • DNS-over-HTTPS 4
  • DoH 4
  • emoji 1
  • emscriptem 1
  • enterprise 1
  • extensions 27
  • Fast badging 1
  • faster web 1
  • features 1
  • feedback 2
  • field data 1
  • first input delay 1
  • Follow 1
  • fonts 1
  • form controls 1
  • frameworks 1
  • fugu 2
  • fund 1
  • funding 1
  • gdd 1
  • google earth 1
  • google event 1
  • google io 2019 1
  • google web developer 1
  • googlechrome 12
  • harmful ads 1
  • html5 11
  • HTTP/3 1
  • HTTPS 4
  • iframes 1
  • images 1
  • incognito 1
  • insecure forms 1
  • intent to explain 1
  • ios 1
  • ios Chrome 1
  • issue tracker 3
  • jank 1
  • javascript 5
  • lab data 1
  • labelling 1
  • largest contentful paint 1
  • launch 1
  • lazy-loading 1
  • lighthouse 2
  • linux 2
  • Lite Mode 2
  • Lite pages 1
  • loading interventions 1
  • loading optimizations 1
  • lock icon 1
  • long-tail 1
  • mac 1
  • manifest v3 2
  • metrics 2
  • microsoft edge 1
  • mixed forms 1
  • mobile 2
  • na 1
  • native client 8
  • native file system 1
  • New Features 5
  • notifications 1
  • octane 1
  • open web 4
  • origin trials 2
  • pagespeed insights 1
  • pagespeedinsights 1
  • passwords 1
  • payment handler 1
  • payment request 1
  • payments 2
  • performance 20
  • performance tools 1
  • permission UI 1
  • permissions 1
  • play store 1
  • portals 3
  • prefetching 1
  • privacy 2
  • privacy sandbox 4
  • private prefetch proxy 1
  • profile guided optimization 1
  • progressive web apps 2
  • Project Strobe 1
  • protection 1
  • pwa 1
  • QUIC 1
  • quieter permissions 1
  • releases 3
  • removals 1
  • rlz 1
  • root program 1
  • safe browsing 2
  • Secure DNS 2
  • security 36
  • site isolation 1
  • slow loading 1
  • sms receiver 1
  • spam policy 1
  • spdy 2
  • spectre 1
  • speed 4
  • ssl 2
  • store listing 1
  • strobe 2
  • subscription pages 1
  • suspicious site reporter extension 1
  • TCP 1
  • the fast and the curious 26
  • TLS 1
  • tools 1
  • tracing 1
  • transparency 1
  • trusted web activities 1
  • twa 2
  • user agent string 1
  • user data policy 1
  • v8 6
  • video 2
  • wasm 1
  • web 1
  • web apps 1
  • web assembly 2
  • web developers 1
  • web intents 1
  • web packaging 1
  • web payments 1
  • web platform 1
  • web request api 1
  • web vitals 1
  • web.dev 1
  • web.dev live 1
  • webapi 1
  • webassembly 1
  • webaudio 3
  • webgl 7
  • webkit 5
  • WebM 1
  • webmaster 1
  • webp 5
  • webrtc 6
  • websockets 5
  • webtiming 1
  • writable-files 1
  • yerba beuna center for the arts 1


Archive


  •     2025
    • Oct
    • Jul
    • Jun
    • May
    • Jan
  •     2024
    • Dec
    • Aug
    • Jun
    • May
    • Apr
    • Mar
    • Feb
  •     2023
    • Nov
    • Oct
    • Sep
    • Aug
    • Jun
    • May
    • Apr
    • Feb
  •     2022
    • Dec
    • Sep
    • Aug
    • Jun
    • May
    • Apr
    • Mar
    • Feb
    • Jan
  •     2021
    • Dec
    • Nov
    • Oct
    • Sep
    • Aug
    • Jul
    • Jun
    • May
    • Apr
    • Mar
    • Feb
    • Jan
  •     2020
    • Dec
    • Nov
    • Oct
    • Sep
    • Aug
    • Jul
    • Jun
    • May
    • Apr
    • Mar
    • Feb
    • Jan
  •     2019
    • Dec
    • Nov
    • Oct
    • Sep
    • Aug
    • Jul
    • Jun
    • May
    • Apr
    • Mar
    • Feb
    • Jan
  •     2018
    • Dec
    • Nov
    • Oct
    • Sep
    • Aug
    • Jul
    • Jun
    • May
    • Apr
    • Mar
    • Feb
    • Jan
  •     2017
    • Dec
    • Nov
    • Oct
    • Sep
    • Aug
    • Jul
    • Jun
    • May
    • Apr
    • Mar
    • Feb
    • Jan
  •     2016
    • Dec
    • Nov
    • Oct
    • Sep
    • Aug
    • Jun
    • May
    • Apr
    • Mar
    • Feb
    • Jan
  •     2015
    • Dec
    • Nov
    • Oct
    • Sep
    • Aug
    • Jul
    • Jun
    • May
    • Apr
    • Mar
    • Feb
    • Jan
  •     2014
    • Dec
    • Nov
    • Oct
    • Sep
    • Aug
    • Jul
    • Jun
    • May
    • Apr
    • Mar
    • Feb
    • Jan
  •     2013
    • Dec
    • Nov
    • Oct
    • Sep
    • Aug
    • Jul
    • Jun
    • May
    • Apr
    • Mar
    • Feb
    • Jan
  •     2012
    • Dec
    • Nov
    • Oct
    • Sep
    • Aug
    • Jul
    • Jun
    • May
    • Apr
    • Mar
    • Feb
    • Jan
  •     2011
    • Dec
    • Nov
    • Oct
    • Sep
    • Aug
    • Jul
    • Jun
    • May
    • Apr
    • Mar
    • Feb
    • Jan
  •     2010
    • Dec
    • Nov
    • Oct
    • Sep
    • Aug
    • Jul
    • Jun
    • May
    • Apr
    • Mar
    • Feb
    • Jan
  •     2009
    • Dec
    • Nov
    • Sep
    • Aug
    • Jul
    • Jun
    • May
    • Apr
    • Mar
    • Feb
    • Jan
  •     2008
    • Dec
    • Nov
    • Oct
    • Sep

Feed

Give us feedback in our Product Forums.
  • Google
  • Privacy
  • Terms

Follow Lee on X/Twitter - Father, Husband, Serial builder creating AI, crypto, games & web tools. We are friends :) AI Will Come To Life!

Check out: eBank.nz (Art Generator) | Netwrck.com (AI Tools) | Text-Generator.io (AI API) | BitBank.nz (Crypto AI) | ReadingTime (Kids Reading) | RewordGame | BigMultiplayerChess | WebFiddle | How.nz | Helix AI Assistant