What Is Total Blocking Time?

Published
14 min read

Total Blocking Time sums the blocking portion of long main-thread tasks in lab tests. Learn its threshold, causes and fixes.

What Is Total Blocking Time?

Total Blocking Time, or TBT, is a lab metric that sums the blocking portion of long main-thread tasks during the measured loading window, commonly from First Contentful Paint until Time to Interactive.

The browser’s main thread parses HTML, executes most JavaScript, calculates styles, performs layout and coordinates rendering. It handles one task at a time. When a task runs longer than 50 milliseconds, the time beyond that threshold is considered blocking time because an input arriving during that portion may have to wait. TBT adds those blocking portions across the selected trace window. It does not prove that a visitor actually interacted during a task, and it is not a field Core Web Vital. Its strength is controlled diagnosis: it quantifies how much potentially unresponsive main-thread time a page creates while loading.

  • Measured primarily in controlled lab tests
  • Focuses main-thread long tasks
  • Counts only time beyond 50 milliseconds per task
  • Usually starts at First Contentful Paint
  • Often ends at Time to Interactive
  • Indicates potential load responsiveness problems
  1. Frame the decision raised by What Is Total Blocking Time.
  2. Render the page with its required scripts and resources.
  3. Compare content, links, metadata and canonical signals.
  4. Trace each difference to the responsible template or script.
  5. Apply the fix and repeat both observations.
TBT fundamentals
QuestionAnswerWhy it matters
What is summed?Blocking portions of long tasksQuantifies main-thread pressure
Long-task thresholdMore than 50 msSeparates short work
Typical windowFCP to TTIFocuses loading phase
Measurement typeLab metricControlled comparison
Is input required?NoPotential rather than observed delay
Is it Core Web Vital?NoDiagnostic, not field outcome

TBT is most valuable as a laboratory explanation of main-thread congestion, not as a substitute for real-user interaction evidence.

What Is a Good Total Blocking Time?

A practical lab target is less than 200 milliseconds of TBT on average mobile hardware, interpreted with the exact tool version, device profile, trace window and page content used in the test.

TBT is sensitive to CPU throttling, hardware, browser version, cache state, network setup and the endpoint chosen by the tool. A desktop run can hide execution cost that becomes severe on a mid-range phone. One fast run can also miss asynchronous work that appears under different timing. Use repeated tests with a stable configuration and compare like with like. The target helps prioritize work but does not guarantee responsive field interactions. A page can have low load-time TBT and still run a heavy callback after a visitor opens a later modal. Pair lab results with Interaction to Next Paint field data.

  • Target less than 200 milliseconds in a representative lab
  • Keep device and CPU profile consistent
  • Use the same browser and audit version
  • Repeat runs to reduce variance
  • Compare equivalent cache and route states
  • Validate real interactions in field data
  1. Frame the decision raised by What Is a Good Total Blocking Time.
  2. Render the page with its required scripts and resources.
  3. Compare content, links, metadata and canonical signals.
  4. Trace each difference to the responsible template or script.
  5. Apply the fix and repeat both observations.
TBT interpretation
ObservationMeaningAction
< 200 msStrong lab targetProtect against regression
High on mobile onlyCPU sensitivityReduce execution cost
High one templateShared route codeFix template bundle
High varianceTiming or third-party instabilityRepeat and inspect traces
Low TBT, poor INPLater interaction issueProfile real target
High TBT, good INPPotential load congestionReview user timing

Use the 200-millisecond target within a stable lab contract and confirm that improvements benefit real interactions rather than only the audit score.

How Is Total Blocking Time Calculated?

For each main-thread task longer than 50 milliseconds, blocking time equals task duration minus 50 milliseconds. TBT is the sum of those blocking portions inside the measurement window.

A 70-millisecond task contributes 20 milliseconds. A 250-millisecond task contributes 200 milliseconds. A 40-millisecond task contributes none, although many short tasks can still consume substantial total CPU. The threshold reflects the browser’s inability to interrupt a running task and the growing chance that input waits noticeably. Tools commonly measure after FCP because the concern is a page that shows content yet remains difficult to use while long tasks continue. The end of the window must be documented; Lighthouse commonly uses Time to Interactive, while other traces may sum over a different duration. Never compare totals from different windows without labeling them.

  1. Choose the controlled trace window.
  2. List main-thread tasks inside that window.
  3. Identify tasks longer than 50 milliseconds.
  4. Subtract 50 milliseconds from each long task.
  5. Sum the remaining blocking portions.
  6. Record device, tool and route context.
  • Evidence for How Is Total Blocking Time Calculated: the raw html returned by the server
  • The rendered DOM after required scripts run
  • Content, links and metadata that differ between those states
  • Network, console and hydration failures tied to the page
  • A repeatable test at the exact URL and device context
TBT calculation examples
Task durationBlocking portionReason
35 ms0 msBelow threshold
50 ms0 msNo excess
70 ms20 ms70 minus 50
90 ms40 ms90 minus 50
155 ms105 ms155 minus 50
250 ms200 ms250 minus 50

TBT calculation is simple, but useful comparison depends on a consistent window and representative hardware.

Total Blocking Time vs INP and Time to Interactive

TBT sums potential blocking during a lab load, INP measures real qualifying interaction latency across field visits, and Time to Interactive estimates when the page becomes reliably interactive. They answer related but different questions.

TBT can flag a page that spends much of loading in long tasks even when no synthetic interaction occurs. INP observes what happened when real users clicked, tapped or typed and includes input, processing and presentation delay. TTI is a milestone used by some tools to define the end of the load-interactivity window, but it can be sensitive to quiet-window assumptions. A low TBT often supports stronger INP, yet the correlation is not perfect. A slow interaction after the load window may hurt INP without changing TBT. A large load task may raise TBT even if users rarely interact then. Use TBT for repeatable root-cause work and INP for population outcome.

  • TBT: laboratory main-thread blocking sum
  • INP: field interaction responsiveness outcome
  • TTI: estimated reliable-interactivity milestone
  • FCP: start of the common TBT window
  • Long tasks can affect several metrics
  • Metrics should not be substituted blindly
  1. Frame the decision raised by Total Blocking Time vs INP and Time to Interactive.
  2. Render the page with its required scripts and resources.
  3. Compare content, links, metadata and canonical signals.
  4. Trace each difference to the responsible template or script.
  5. Apply the fix and repeat both observations.
Responsiveness metrics compared
MetricData sourceQuestion
TBTLabHow much load-time blocking exists?
INPFieldHow slow were real interactions?
TTILabWhen did sustained interactivity arrive?
FCPField or labWhen did first content appear?
Long tasksTrace/APIWhich tasks monopolized the thread?
Long framesField or traceWhich frames delayed rendering?

Use TBT to diagnose controlled loading work and INP to verify whether real visitors experience responsive interactions.

What Causes High Total Blocking Time?

High TBT commonly comes from large JavaScript bundles, expensive initialization, third-party scripts, hydration, repeated component rendering, heavy parsing, broad DOM operations and long style or layout work.

Downloaded bytes matter because they must often be parsed and executed, but bundle size alone does not identify the task. A small script can run an expensive loop or query thousands of nodes. A framework may hydrate an entire page even though only a few controls need behavior. Tag managers can load several vendors whose work overlaps on the main thread. JSON parsing and state normalization can create large startup tasks. CSS and DOM changes can trigger synchronous style and layout calculation inside JavaScript call stacks. Inspect the task’s attribution, call tree and initiator. Group third-party and first-party work separately so optimization ownership remains clear.

  • Unused JavaScript parsing and execution
  • Large synchronous application initialization
  • Whole-page hydration
  • Third-party tag and vendor work
  • Heavy JSON parsing or state setup
  • Broad DOM queries and repeated rendering
  • Forced style and layout calculations
  1. Frame the decision raised by What Causes High Total Blocking Time.
  2. Render the page with its required scripts and resources.
  3. Compare content, links, metadata and canonical signals.
  4. Trace each difference to the responsible template or script.
  5. Apply the fix and repeat both observations.
High TBT causes
CauseTrace symptomOwner
Large bundleLong compile and evaluate tasksBuild/application
HydrationLong activation taskFramework/component
Third partyVendor-attributed tasksMarketing/vendor
Data parsingLong parse call stackData layer
DOM workLarge scripting and layout sequenceUI component
PolyfillsLegacy code executionCompatibility strategy

The highest-value TBT fixes remove or split the specific long tasks proven in the trace rather than optimizing JavaScript by file size alone.

How Do You Reduce Long Main-Thread Tasks?

Reduce long tasks by eliminating unnecessary work, splitting necessary computation into safe chunks, yielding between units, narrowing DOM updates and moving suitable pure computation off the main thread.

Start with the largest blocking contributors. Remove dead code and route-inappropriate features before tuning execution. Break loops, initialization and rendering into units that leave the application in consistent states. Commit the minimum visible update first, then continue secondary work when safe. A worker can handle appropriate computation, but serialization and messaging create cost. Batch DOM reads before writes to avoid forced layout. Selective hydration can reduce activation work when public content remains stable HTML. Yielding improves scheduling only if tasks are actually decomposed; wrapping one enormous synchronous function in a timer does not make its internal work interruptible.

  1. Rank long tasks by blocking contribution.
  2. Remove code the route does not need.
  3. Split necessary work at safe state boundaries.
  4. Yield between computation units.
  5. Reduce DOM query and update scope.
  6. Move suitable pure work to a worker.
  7. Retest functionality and interaction timing.
  • Evidence for How Do You Reduce Long Main-Thread Tasks: the raw html returned by the server
  • The rendered DOM after required scripts run
  • Content, links and metadata that differ between those states
  • Network, console and hydration failures tied to the page
  • A repeatable test at the exact URL and device context
Long-task reduction choices
TechniqueBenefitRisk
Remove unused codeEliminates work entirelyMissing hidden feature
Route splittingSmaller startup scopeCold feature fetch
Task chunkingMore scheduling opportunitiesState complexity
YieldingLets input and paint proceedToo much overhead
WorkerMoves computationMessaging cost
DOM batchingReduces forced layoutStale measurement

Reduce blocking time by creating smaller, necessary units of work while preserving correct state and primary actions.

How Do Third-Party Scripts Affect TBT?

Third-party scripts affect TBT when their loaders, analytics, ads, experiments, chat or consent code parse and execute long tasks on the same main thread as the page’s core experience.

A small bootstrap request can load a much larger execution chain, so inspect initiators and task attribution rather than only script tag size. Define which vendors are necessary before first interaction and delay the rest. Load independent scripts asynchronously when their ordering allows, but remember that async changes scheduling rather than execution cost. Tag-manager governance should prevent duplicate tools and uncontrolled triggers. Consent decisions must remain accurate; performance work cannot bypass required privacy behavior. Test vendor failure, slow response and post-load activity. A third party may contribute little during one lab run and much more when an auction, experiment or chat initialization activates.

  • Inventory vendors and their loaded descendants
  • Assign an owner and purpose to each tool
  • Delay nonessential vendors until appropriate
  • Remove duplicate analytics and experiments
  • Limit triggers and data-layer churn
  • Test consent, failure and active vendor states
  1. Frame the decision raised by How Do Third-Party Scripts Affect TBT.
  2. Render the page with its required scripts and resources.
  3. Compare content, links, metadata and canonical signals.
  4. Trace each difference to the responsible template or script.
  5. Apply the fix and repeat both observations.
Third-party TBT controls
ControlPurposeVerification
Vendor inventoryExpose execution footprintInitiator tree
Business ownerCreate accountabilityRenewal review
Delayed loadingProtect critical pathFeature timing
Async schedulingAvoid parser blockOrder and errors
Trigger limitsReduce repeated workTag-manager events
RemovalEliminate unused toolBusiness outcome

Third-party performance improves when every vendor has a measured execution cost, a named purpose and a deliberate loading boundary.

How Do You Improve and Audit TBT?

Improve and audit TBT by running consistent mobile lab tests, ranking long tasks by blocking contribution, tracing first- and third-party call stacks, fixing shared code and verifying INP and application behavior afterward.

Select representative route families and use the same device, CPU, network, browser and audit version. Run several times and examine the median alongside variance. Record FCP, the TBT window and each long task. Attribute tasks to bundles, modules, components and vendors. Inspect client rendering, resource scheduling and hydration where startup dominates. Make one class of change at a time, then rerun the full route set. Verify primary actions, keyboard behavior and data correctness. Finally, monitor field INP because a lower lab TBT is valuable only when real responsiveness stays correct or improves.

  1. Define a stable representative lab profile.
  2. Test important route families repeatedly.
  3. Capture FCP, TTI and long-task traces.
  4. Rank blocking contribution by owner.
  5. Remove, split or reschedule proven work.
  6. Regression-test primary actions.
  7. Compare TBT under the same profile.
  8. Validate field INP after release.
  • Evidence for How Do You Improve and Audit TBT: the raw html returned by the server
  • The rendered DOM after required scripts run
  • Content, links and metadata that differ between those states
  • Network, console and hydration failures tied to the page
  • A repeatable test at the exact URL and device context
TBT audit worksheet
CheckEvidencePass condition
Lab contractSaved test profileRepeatable conditions
WindowFCP-to-end timestampsComparable totals
Long tasksTrace listLargest contributors known
AttributionCall tree and initiatorOwner identified
Third partiesVendor task totalsDeliberate loading
FunctionalityAction test suiteNo broken behavior
RegressionRoute comparisonShared gains
Field outcomeINP trendReal responsiveness protected

Start with a relevant free SEO check, continue the evidence workflow in Novaverb, and review pricing when comparing continuous monitoring with a one-time manual review.

A complete TBT audit connects a repeatable laboratory score to specific long tasks, named owners and verified real-user responsiveness.