From bef1c8b45ff8242bed2a696f686ccba8c9e3dd40 Mon Sep 17 00:00:00 2001 From: Connor Clark Date: Mon, 22 May 2023 16:49:03 -0700 Subject: [PATCH 1/7] core(network-analyzer): coarse rtt estimate on per-origin basis --- .../simulator/network-analyzer.js | 210 ++++++++++-------- .../audits/__snapshots__/metrics-test.js.snap | 24 +- .../predictive-perf-test.js.snap | 28 +-- .../byte-efficiency-audit-test.js | 2 +- .../render-blocking-resources-test.js | 4 +- .../audits/dobetterweb/uses-http2-test.js | 4 +- core/test/audits/predictive-perf-test.js | 2 +- .../lantern-largest-contentful-paint-test.js | 6 +- .../metrics/largest-contentful-paint-test.js | 6 +- .../computed/metrics/lcp-breakdown-test.js | 4 +- core/test/computed/network-analysis-test.js | 5 +- .../reports/sample-flow-result.json | 68 +++--- .../simulator/network-analyzer-test.js | 10 + 13 files changed, 206 insertions(+), 167 deletions(-) diff --git a/core/lib/dependency-graph/simulator/network-analyzer.js b/core/lib/dependency-graph/simulator/network-analyzer.js index 949e513986bd..9f7163606cff 100644 --- a/core/lib/dependency-graph/simulator/network-analyzer.js +++ b/core/lib/dependency-graph/simulator/network-analyzer.js @@ -132,23 +132,22 @@ class NetworkAnalyzer { * single handshake. * This is the most accurate and preferred method of measurement when the data is available. * - * @param {LH.Artifacts.NetworkRequest[]} records - * @return {Map} + * @param {RequestInfo} info + * @return {number[]|number|undefined} */ - static _estimateRTTByOriginViaConnectionTiming(records) { - return NetworkAnalyzer._estimateValueByOrigin(records, ({timing, connectionReused, record}) => { - if (connectionReused) return; - - if (timing.connectEnd > 0 && timing.connectStart > 0 && record.protocol.startsWith('h3')) { - // These values are equal to sslStart and sslEnd for h3. - return timing.connectEnd - timing.connectStart; - } else if (timing.sslStart > 0 && timing.sslEnd > 0) { - // SSL can also be more than 1 RT but assume False Start was used. - return [timing.connectEnd - timing.sslStart, timing.sslStart - timing.connectStart]; - } else if (timing.connectStart > 0 && timing.connectEnd > 0) { - return timing.connectEnd - timing.connectStart; - } - }); + static _estimateRTTViaConnectionTiming(info) { + const {timing, connectionReused, record} = info; + if (connectionReused) return; + + if (timing.connectEnd > 0 && timing.connectStart > 0 && record.protocol.startsWith('h3')) { + // These values are equal to sslStart and sslEnd for h3. + return timing.connectEnd - timing.connectStart; + } else if (timing.sslStart > 0 && timing.sslEnd > 0) { + // SSL can also be more than 1 RT but assume False Start was used. + return [timing.connectEnd - timing.sslStart, timing.sslStart - timing.connectStart]; + } else if (timing.connectStart > 0 && timing.connectEnd > 0) { + return timing.connectEnd - timing.connectStart; + } } /** @@ -156,26 +155,27 @@ class NetworkAnalyzer { * NOTE: this will tend to overestimate the actual RTT quite significantly as the download can be * slow for other reasons as well such as bandwidth constraints. * - * @param {LH.Artifacts.NetworkRequest[]} records - * @return {Map} + * @param {RequestInfo} info + * @return {number|undefined} */ - static _estimateRTTByOriginViaDownloadTiming(records) { - return NetworkAnalyzer._estimateValueByOrigin(records, ({record, timing, connectionReused}) => { - if (connectionReused) return; - // Only look at downloads that went past the initial congestion window - if (record.transferSize <= INITIAL_CWD) return; - if (!Number.isFinite(timing.receiveHeadersEnd) || timing.receiveHeadersEnd < 0) return; + static _estimateRTTViaDownloadTiming(info) { + const {timing, connectionReused, record} = info; + if (connectionReused) return; - // Compute the amount of time downloading everything after the first congestion window took - const totalTime = record.networkEndTime - record.networkRequestTime; - const downloadTimeAfterFirstByte = totalTime - timing.receiveHeadersEnd; - const numberOfRoundTrips = Math.log2(record.transferSize / INITIAL_CWD); + // Only look at downloads that went past the initial congestion window + if (record.transferSize <= INITIAL_CWD) return; + if (!Number.isFinite(timing.receiveHeadersEnd) || timing.receiveHeadersEnd < 0) return; - // Ignore requests that required a high number of round trips since bandwidth starts to play - // a larger role than latency - if (numberOfRoundTrips > 5) return; - return downloadTimeAfterFirstByte / numberOfRoundTrips; - }); + // Compute the amount of time downloading everything after the first congestion window took + const totalTime = record.networkEndTime - record.networkRequestTime; + const downloadTimeAfterFirstByte = totalTime - timing.receiveHeadersEnd; + const numberOfRoundTrips = Math.log2(record.transferSize / INITIAL_CWD); + + // Ignore requests that required a high number of round trips since bandwidth starts to play + // a larger role than latency + if (numberOfRoundTrips > 5) return; + + return downloadTimeAfterFirstByte / numberOfRoundTrips; } /** @@ -184,20 +184,20 @@ class NetworkAnalyzer { * NOTE: this will tend to overestimate the actual RTT as the request can be delayed for other * reasons as well such as more SSL handshakes if TLS False Start is not enabled. * - * @param {LH.Artifacts.NetworkRequest[]} records - * @return {Map} + * @param {RequestInfo} info + * @return {number|undefined} */ - static _estimateRTTByOriginViaSendStartTiming(records) { - return NetworkAnalyzer._estimateValueByOrigin(records, ({record, timing, connectionReused}) => { - if (connectionReused) return; - if (!Number.isFinite(timing.sendStart) || timing.sendStart < 0) return; - - // Assume everything before sendStart was just DNS + (SSL)? + TCP handshake - // 1 RT for DNS, 1 RT (maybe) for SSL, 1 RT for TCP - let roundTrips = 2; - if (record.parsedURL.scheme === 'https') roundTrips += 1; - return timing.sendStart / roundTrips; - }); + static _estimateRTTViaSendStartTiming(info) { + const {timing, connectionReused, record} = info; + if (connectionReused) return; + + if (!Number.isFinite(timing.sendStart) || timing.sendStart < 0) return; + + // Assume everything before sendStart was just DNS + (SSL)? + TCP handshake + // 1 RT for DNS, 1 RT (maybe) for SSL, 1 RT for TCP + let roundTrips = 2; + if (record.parsedURL.scheme === 'https') roundTrips += 1; + return timing.sendStart / roundTrips; } /** @@ -206,34 +206,33 @@ class NetworkAnalyzer { * NOTE: this is the most inaccurate way to estimate the RTT, but in some environments it's all * we have access to :( * - * @param {LH.Artifacts.NetworkRequest[]} records - * @return {Map} + * @param {RequestInfo} info + * @return {number|undefined} */ - static _estimateRTTByOriginViaHeadersEndTiming(records) { - return NetworkAnalyzer._estimateValueByOrigin(records, ({record, timing, connectionReused}) => { - if (!Number.isFinite(timing.receiveHeadersEnd) || timing.receiveHeadersEnd < 0) return; - if (!record.resourceType) return; - - const serverResponseTimePercentage = - SERVER_RESPONSE_PERCENTAGE_OF_TTFB[record.resourceType] || - DEFAULT_SERVER_RESPONSE_PERCENTAGE; - const estimatedServerResponseTime = timing.receiveHeadersEnd * serverResponseTimePercentage; - - // When connection was reused... - // TTFB = 1 RT for request + server response time - let roundTrips = 1; - - // When connection was fresh... - // TTFB = DNS + (SSL)? + TCP handshake + 1 RT for request + server response time - if (!connectionReused) { - roundTrips += 1; // DNS - if (record.parsedURL.scheme === 'https') roundTrips += 1; // SSL - roundTrips += 1; // TCP handshake - } + static _estimateRTTViaHeadersEndTiming(info) { + const {timing, connectionReused, record} = info; + if (!Number.isFinite(timing.receiveHeadersEnd) || timing.receiveHeadersEnd < 0) return; + if (!record.resourceType) return; + + const serverResponseTimePercentage = + SERVER_RESPONSE_PERCENTAGE_OF_TTFB[record.resourceType] || + DEFAULT_SERVER_RESPONSE_PERCENTAGE; + const estimatedServerResponseTime = timing.receiveHeadersEnd * serverResponseTimePercentage; + + // When connection was reused... + // TTFB = 1 RT for request + server response time + let roundTrips = 1; + + // When connection was fresh... + // TTFB = DNS + (SSL)? + TCP handshake + 1 RT for request + server response time + if (!connectionReused) { + roundTrips += 1; // DNS + if (record.parsedURL.scheme === 'https') roundTrips += 1; // SSL + roundTrips += 1; // TCP handshake + } - // subtract out our estimated server response time - return Math.max((timing.receiveHeadersEnd - estimatedServerResponseTime) / roundTrips, 3); - }); + // subtract out our estimated server response time + return Math.max((timing.receiveHeadersEnd - estimatedServerResponseTime) / roundTrips, 3); } /** @@ -335,32 +334,59 @@ class NetworkAnalyzer { useHeadersEndEstimates = true, } = options || {}; - let estimatesByOrigin = NetworkAnalyzer._estimateRTTByOriginViaConnectionTiming(records); - if (!estimatesByOrigin.size || forceCoarseEstimates) { - estimatesByOrigin = new Map(); - const estimatesViaDownload = NetworkAnalyzer._estimateRTTByOriginViaDownloadTiming(records); - const estimatesViaSendStart = NetworkAnalyzer._estimateRTTByOriginViaSendStartTiming(records); - const estimatesViaTTFB = NetworkAnalyzer._estimateRTTByOriginViaHeadersEndTiming(records); + const connectionWasReused = NetworkAnalyzer.estimateIfConnectionWasReused(records); + const groupedByOrigin = NetworkAnalyzer.groupByOrigin(records); - for (const [origin, estimates] of estimatesViaDownload.entries()) { - if (!useDownloadEstimates) continue; - estimatesByOrigin.set(origin, estimates); + const estimatesByOrigin = new Map(); + for (const [origin, originRecords] of groupedByOrigin.entries()) { + /** @type {number[]} */ + const originEstimates = []; + + /** + * @param {(e: RequestInfo) => number[]|number|undefined} estimator + */ + // eslint-disable-next-line no-inner-declarations + function collectEstimates(estimator, multiplier = 1) { + for (const record of originRecords) { + const timing = record.timing; + if (!timing) continue; + + const estimates = estimator({ + record, + timing, + connectionReused: connectionWasReused.get(record.requestId), + }); + if (estimates === undefined) continue; + + if (!Array.isArray(estimates)) { + originEstimates.push(estimates * multiplier); + } else { + originEstimates.push(...estimates.map(e => e * multiplier)); + } + } } - for (const [origin, estimates] of estimatesViaSendStart.entries()) { - if (!useSendStartEstimates) continue; - const existing = estimatesByOrigin.get(origin) || []; - estimatesByOrigin.set(origin, existing.concat(estimates)); - } + collectEstimates(this._estimateRTTViaConnectionTiming); - for (const [origin, estimates] of estimatesViaTTFB.entries()) { - if (!useHeadersEndEstimates) continue; - const existing = estimatesByOrigin.get(origin) || []; - estimatesByOrigin.set(origin, existing.concat(estimates)); + // Connection timing can be missing for a few reasons: + // - Origin was preconnected, which we don't have instrumentation for. + // - Trace began recording after a connection has already been established (for example, in timespan mode) + // - Perhaps Chrome established a connection already in the background (service worker? Just guessing here) + // - Not provided in LR netstack. + if (!originEstimates.length || forceCoarseEstimates) { + if (useDownloadEstimates) { + collectEstimates(this._estimateRTTViaDownloadTiming, coarseEstimateMultiplier); + } + if (useSendStartEstimates) { + collectEstimates(this._estimateRTTViaSendStartTiming, coarseEstimateMultiplier); + } + if (useHeadersEndEstimates) { + collectEstimates(this._estimateRTTViaHeadersEndTiming, coarseEstimateMultiplier); + } } - for (const estimates of estimatesByOrigin.values()) { - estimates.forEach((x, i) => (estimates[i] = x * coarseEstimateMultiplier)); + if (originEstimates.length) { + estimatesByOrigin.set(origin, originEstimates); } } diff --git a/core/test/audits/__snapshots__/metrics-test.js.snap b/core/test/audits/__snapshots__/metrics-test.js.snap index 2783540127c9..acb8351b5734 100644 --- a/core/test/audits/__snapshots__/metrics-test.js.snap +++ b/core/test/audits/__snapshots__/metrics-test.js.snap @@ -4,20 +4,20 @@ exports[`Performance: metrics evaluates valid input (with image lcp) correctly 1 Object { "cumulativeLayoutShift": 0, "cumulativeLayoutShiftMainFrame": 0, - "firstContentfulPaint": 3313, + "firstContentfulPaint": 3364, "firstContentfulPaintAllFrames": undefined, "firstContentfulPaintAllFramesTs": undefined, "firstContentfulPaintTs": undefined, - "firstMeaningfulPaint": 3313, + "firstMeaningfulPaint": 3364, "firstMeaningfulPaintTs": undefined, - "interactive": 6380, + "interactive": 6354, "interactiveTs": undefined, - "largestContentfulPaint": 5621, + "largestContentfulPaint": 5567, "largestContentfulPaintAllFrames": undefined, "largestContentfulPaintAllFramesTs": undefined, "largestContentfulPaintTs": undefined, - "lcpLoadEnd": 5572, - "lcpLoadStart": 5449, + "lcpLoadEnd": 5519, + "lcpLoadStart": 5397, "maxPotentialFID": 160, "observedCumulativeLayoutShift": 0, "observedCumulativeLayoutShiftMainFrame": 0, @@ -50,7 +50,7 @@ Object { "observedTotalCumulativeLayoutShift": 0, "observedTraceEnd": 4778, "observedTraceEndTs": 760625421283, - "speedIndex": 6313, + "speedIndex": 6330, "speedIndexTs": undefined, "timeToFirstByte": 2394, "timeToFirstByteTs": undefined, @@ -122,15 +122,15 @@ exports[`Performance: metrics evaluates valid input (with lcp) correctly 1`] = ` Object { "cumulativeLayoutShift": 0, "cumulativeLayoutShiftMainFrame": 0, - "firstContentfulPaint": 2291, + "firstContentfulPaint": 2294, "firstContentfulPaintAllFrames": undefined, "firstContentfulPaintAllFramesTs": undefined, "firstContentfulPaintTs": undefined, - "firstMeaningfulPaint": 2761, + "firstMeaningfulPaint": 2764, "firstMeaningfulPaintTs": undefined, - "interactive": 4446, + "interactive": 4457, "interactiveTs": undefined, - "largestContentfulPaint": 2761, + "largestContentfulPaint": 2764, "largestContentfulPaintAllFrames": undefined, "largestContentfulPaintAllFramesTs": undefined, "largestContentfulPaintTs": undefined, @@ -168,7 +168,7 @@ Object { "observedTotalCumulativeLayoutShift": 0, "observedTraceEnd": 7416, "observedTraceEndTs": 713044439102, - "speedIndex": 3683, + "speedIndex": 3684, "speedIndexTs": undefined, "timeToFirstByte": 611, "timeToFirstByteTs": undefined, diff --git a/core/test/audits/__snapshots__/predictive-perf-test.js.snap b/core/test/audits/__snapshots__/predictive-perf-test.js.snap index 3979eeb585d2..9e196226b02d 100644 --- a/core/test/audits/__snapshots__/predictive-perf-test.js.snap +++ b/core/test/audits/__snapshots__/predictive-perf-test.js.snap @@ -2,23 +2,23 @@ exports[`Performance: predictive performance audit should compute the predicted values 1`] = ` Object { - "optimisticFCP": 2291, - "optimisticFMP": 2291, - "optimisticLCP": 2291, + "optimisticFCP": 2294, + "optimisticFMP": 2294, + "optimisticLCP": 2294, "optimisticSI": 1393, - "optimisticTTI": 3792, - "pessimisticFCP": 2291, - "pessimisticFMP": 3230, - "pessimisticLCP": 3230, - "pessimisticSI": 3049, - "pessimisticTTI": 5099, - "roughEstimateOfFCP": 2291, - "roughEstimateOfFMP": 2761, - "roughEstimateOfLCP": 2761, + "optimisticTTI": 3795, + "pessimisticFCP": 2294, + "pessimisticFMP": 3233, + "pessimisticLCP": 3233, + "pessimisticSI": 3052, + "pessimisticTTI": 5119, + "roughEstimateOfFCP": 2294, + "roughEstimateOfFMP": 2764, + "roughEstimateOfLCP": 2764, "roughEstimateOfLCPLoadEnd": undefined, "roughEstimateOfLCPLoadStart": undefined, - "roughEstimateOfSI": 3683, + "roughEstimateOfSI": 3684, "roughEstimateOfTTFB": 611, - "roughEstimateOfTTI": 4446, + "roughEstimateOfTTI": 4457, } `; diff --git a/core/test/audits/byte-efficiency/byte-efficiency-audit-test.js b/core/test/audits/byte-efficiency/byte-efficiency-audit-test.js index 48f7d29c470c..61deeb4785df 100644 --- a/core/test/audits/byte-efficiency/byte-efficiency-audit-test.js +++ b/core/test/audits/byte-efficiency/byte-efficiency-audit-test.js @@ -294,7 +294,7 @@ describe('Byte efficiency base audit', () => { const result = await MockAudit.audit(artifacts, {settings, computedCache}); const resultTti = await MockTtiAudit.audit(artifacts, {settings, computedCache}); expect(resultTti.numericValue).toBeLessThan(result.numericValue); - expect(result.numericValue).toMatchInlineSnapshot(`2280`); + expect(result.numericValue).toMatchInlineSnapshot(`2130`); expect(resultTti.numericValue).toMatchInlineSnapshot(`110`); }); diff --git a/core/test/audits/byte-efficiency/render-blocking-resources-test.js b/core/test/audits/byte-efficiency/render-blocking-resources-test.js index 1ea43804c454..a6b4ec8c9df3 100644 --- a/core/test/audits/byte-efficiency/render-blocking-resources-test.js +++ b/core/test/audits/byte-efficiency/render-blocking-resources-test.js @@ -76,12 +76,12 @@ describe('Render blocking resources audit', () => { const settings = {throttlingMethod: 'simulate', throttling: mobileSlow4G}; const computedCache = new Map(); const result = await RenderBlockingResourcesAudit.audit(artifacts, {settings, computedCache}); - expect(result.numericValue).toMatchInlineSnapshot(`450`); + expect(result.numericValue).toMatchInlineSnapshot(`469`); expect(result.details.items).toMatchObject([ { 'totalBytes': 621, 'url': 'https://fonts.googleapis.com/css?family=Fira+Sans+Condensed%3A400%2C400i%2C600%2C600i&subset=latin%2Clatin-ext&display=swap', - 'wastedMs': 465, + 'wastedMs': 440, }, // Due to internal H2 simulation details, parallel HTTP/2 requests are pipelined which makes // it look like Montserrat starts after Fira Sans finishes. It would be preferred diff --git a/core/test/audits/dobetterweb/uses-http2-test.js b/core/test/audits/dobetterweb/uses-http2-test.js index 1a102d5f8f19..6e43d4b41960 100644 --- a/core/test/audits/dobetterweb/uses-http2-test.js +++ b/core/test/audits/dobetterweb/uses-http2-test.js @@ -71,8 +71,8 @@ describe('Resources are fetched over http/2', () => { expect(urls).not.toContain(records[30].url); expect(result.details.items).toHaveLength(30); // make sure we report less savings - expect(result.numericValue).toMatchInlineSnapshot(`320`); - expect(result.details.overallSavingsMs).toMatchInlineSnapshot(`320`); + expect(result.numericValue).toMatchInlineSnapshot(`360`); + expect(result.details.overallSavingsMs).toMatchInlineSnapshot(`360`); }); it('should return table items for timespan mode', async () => { diff --git a/core/test/audits/predictive-perf-test.js b/core/test/audits/predictive-perf-test.js index 70bec4f853f0..9be210addb35 100644 --- a/core/test/audits/predictive-perf-test.js +++ b/core/test/audits/predictive-perf-test.js @@ -25,7 +25,7 @@ describe('Performance: predictive performance audit', () => { const context = {computedCache: new Map(), settings: {locale: 'en'}}; const output = await PredictivePerf.audit(artifacts, context); - expect(output.displayValue).toBeDisplayString('4,450 ms'); + expect(output.displayValue).toBeDisplayString('4,460 ms'); const metrics = output.details.items[0]; for (const [key, value] of Object.entries(metrics)) { metrics[key] = value === undefined ? value : Math.round(value); diff --git a/core/test/computed/metrics/lantern-largest-contentful-paint-test.js b/core/test/computed/metrics/lantern-largest-contentful-paint-test.js index 9a31a89d5e72..589f0f797273 100644 --- a/core/test/computed/metrics/lantern-largest-contentful-paint-test.js +++ b/core/test/computed/metrics/lantern-largest-contentful-paint-test.js @@ -29,9 +29,9 @@ describe('Metrics: Lantern LCP', () => { pessimistic: Math.round(result.pessimisticEstimate.timeInMs)}). toMatchInlineSnapshot(` Object { - "optimistic": 2291, - "pessimistic": 3230, - "timing": 2761, + "optimistic": 2294, + "pessimistic": 3233, + "timing": 2764, } `); assert.equal(result.optimisticEstimate.nodeTimings.size, 12); diff --git a/core/test/computed/metrics/largest-contentful-paint-test.js b/core/test/computed/metrics/largest-contentful-paint-test.js index f85a07fa79e2..f9d61a6b13fb 100644 --- a/core/test/computed/metrics/largest-contentful-paint-test.js +++ b/core/test/computed/metrics/largest-contentful-paint-test.js @@ -30,9 +30,9 @@ describe('Metrics: LCP', () => { pessimistic: Math.round(result.pessimisticEstimate.timeInMs)}). toMatchInlineSnapshot(` Object { - "optimistic": 2291, - "pessimistic": 3230, - "timing": 2761, + "optimistic": 2294, + "pessimistic": 3233, + "timing": 2764, } `); }); diff --git a/core/test/computed/metrics/lcp-breakdown-test.js b/core/test/computed/metrics/lcp-breakdown-test.js index ebcd6ee1caa0..2e380e2ae8d2 100644 --- a/core/test/computed/metrics/lcp-breakdown-test.js +++ b/core/test/computed/metrics/lcp-breakdown-test.js @@ -102,8 +102,8 @@ describe('LCPBreakdown', () => { const result = await LCPBreakdown.request(data, {computedCache: new Map()}); expect(result.ttfb).toBeCloseTo(2393.7, 0.1); - expect(result.loadStart).toBeCloseTo(5449.0, 0.1); - expect(result.loadEnd).toBeCloseTo(5572.1, 0.1); + expect(result.loadStart).toBeCloseTo(5396.6, 0.1); + expect(result.loadEnd).toBeCloseTo(5518.5, 0.1); }); it('returns breakdown for a real trace with text LCP', async () => { diff --git a/core/test/computed/network-analysis-test.js b/core/test/computed/network-analysis-test.js index f46fa1a305d5..d0a3f8ce00c8 100644 --- a/core/test/computed/network-analysis-test.js +++ b/core/test/computed/network-analysis-test.js @@ -46,6 +46,9 @@ Map { }); const result = await NetworkAnalysis.request(mutatedLog, {computedCache: new Map()}); - expect(result.additionalRttByOrigin.get('https://www.google-analytics.com')).toEqual(0); + // If the connection timings were not removed, this would be the 1.045 estimate as seen in + // the test above. However, without connection timings we fall back to a coarse estimate and + // get this instead. + expect(result.additionalRttByOrigin.get('https://www.google-analytics.com')).toBeCloseTo(2.86); }); }); diff --git a/core/test/fixtures/fraggle-rock/reports/sample-flow-result.json b/core/test/fixtures/fraggle-rock/reports/sample-flow-result.json index 4539aea2f209..918213722977 100644 --- a/core/test/fixtures/fraggle-rock/reports/sample-flow-result.json +++ b/core/test/fixtures/fraggle-rock/reports/sample-flow-result.json @@ -51,9 +51,9 @@ "id": "first-contentful-paint", "title": "First Contentful Paint", "description": "First Contentful Paint marks the time at which the first text or image is painted. [Learn more about the First Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/first-contentful-paint/).", - "score": 0.98, + "score": 0.97, "scoreDisplayMode": "numeric", - "numericValue": 1352.107, + "numericValue": 1372.2951999999998, "numericUnit": "millisecond", "displayValue": "1.4 s" }, @@ -63,7 +63,7 @@ "description": "Largest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)", "score": 1, "scoreDisplayMode": "numeric", - "numericValue": 1352.107, + "numericValue": 1372.2951999999998, "numericUnit": "millisecond", "displayValue": "1.4 s" }, @@ -73,7 +73,7 @@ "description": "First Meaningful Paint measures when the primary content of a page is visible. [Learn more about the First Meaningful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/first-meaningful-paint/).", "score": 0.99, "scoreDisplayMode": "numeric", - "numericValue": 1352.107, + "numericValue": 1372.2951999999998, "numericUnit": "millisecond", "displayValue": "1.4 s" }, @@ -83,7 +83,7 @@ "description": "Speed Index shows how quickly the contents of a page are visibly populated. [Learn more about the Speed Index metric](https://developer.chrome.com/docs/lighthouse/performance/speed-index/).", "score": 1, "scoreDisplayMode": "numeric", - "numericValue": 1352.107, + "numericValue": 1372.2951999999998, "numericUnit": "millisecond", "displayValue": "1.4 s" }, @@ -242,9 +242,9 @@ "description": "Time to Interactive is the amount of time it takes for the page to become fully interactive. [Learn more about the Time to Interactive metric](https://developer.chrome.com/docs/lighthouse/performance/interactive/).", "score": 0.99, "scoreDisplayMode": "numeric", - "numericValue": 2328.6969999999997, + "numericValue": 2369.0733999999998, "numericUnit": "millisecond", - "displayValue": "2.3 s" + "displayValue": "2.4 s" }, "user-timings": { "id": "user-timings", @@ -669,7 +669,7 @@ "numTasksOver50ms": 0, "numTasksOver100ms": 0, "numTasksOver500ms": 0, - "rtt": 3.406000000000006, + "rtt": 0.041299999999999996, "throughput": 28471144.280089427, "maxRtt": 162.331, "maxServerLatency": 22.397999999999982, @@ -1165,7 +1165,7 @@ }, { "origin": "https://fonts.gstatic.com", - "rtt": 3.406000000000006 + "rtt": 0.041299999999999996 } ], "sortedBy": [ @@ -1204,7 +1204,7 @@ }, { "origin": "https://fonts.gstatic.com", - "serverResponseTime": 17.328999999999994 + "serverResponseTime": 20.6937 }, { "origin": "https://www.mikescerealshack.co", @@ -1280,24 +1280,24 @@ "description": "Collects all available metrics.", "score": null, "scoreDisplayMode": "informative", - "numericValue": 2329, + "numericValue": 2369, "numericUnit": "millisecond", "details": { "type": "debugdata", "items": [ { - "firstContentfulPaint": 1352, - "firstMeaningfulPaint": 1352, - "largestContentfulPaint": 1352, - "interactive": 2329, - "speedIndex": 1352, + "firstContentfulPaint": 1372, + "firstMeaningfulPaint": 1372, + "largestContentfulPaint": 1372, + "interactive": 2369, + "speedIndex": 1372, "totalBlockingTime": 143, "maxPotentialFID": 193, "cumulativeLayoutShift": 0.002631263732910156, "cumulativeLayoutShiftMainFrame": 0.002631263732910156, "totalCumulativeLayoutShift": 0.002631263732910156, - "lcpLoadStart": 985, - "lcpLoadEnd": 1062, + "lcpLoadStart": 1000, + "lcpLoadEnd": 1078, "timeToFirstByte": 615, "observedTimeOrigin": 0, "observedTimeOriginTs": 183712982617, @@ -1579,17 +1579,17 @@ }, { "phase": "Load Delay", - "timing": 370.96815338890303, - "percent": "27%" + "timing": 385.68235231964275, + "percent": "28%" }, { "phase": "Load Time", - "timing": 76.93370773303661, + "timing": 78.082398686087, "percent": "6%" }, { "phase": "Render Delay", - "timing": 289.6881388780603, + "timing": 294.01344899427, "percent": "21%" } ] @@ -1787,17 +1787,17 @@ { "url": "https://www.mikescerealshack.co/_next/static/chunks/framework.9d524150d48315f49e80.js", "duration": 193, - "startTime": 2135.6969999999997 + "startTime": 2176.0733999999998 }, { "url": "https://www.mikescerealshack.co/", "duration": 127, - "startTime": 769.8119999999999 + "startTime": 779.9060999999999 }, { "url": "https://www.mikescerealshack.co/", "duration": 96, - "startTime": 965.8119999999999 + "startTime": 975.9060999999999 } ], "sortedBy": [ @@ -6519,31 +6519,31 @@ "core/lib/i18n/i18n.js | seconds": [ { "values": { - "timeInMs": 1352.107 + "timeInMs": 1372.2951999999998 }, "path": "audits[first-contentful-paint].displayValue" }, { "values": { - "timeInMs": 1352.107 + "timeInMs": 1372.2951999999998 }, "path": "audits[largest-contentful-paint].displayValue" }, { "values": { - "timeInMs": 1352.107 + "timeInMs": 1372.2951999999998 }, "path": "audits[first-meaningful-paint].displayValue" }, { "values": { - "timeInMs": 1352.107 + "timeInMs": 1372.2951999999998 }, "path": "audits[speed-index].displayValue" }, { "values": { - "timeInMs": 2328.6969999999997 + "timeInMs": 2369.0733999999998 }, "path": "audits.interactive.displayValue" }, @@ -8718,12 +8718,12 @@ "rtt": 49.56 }, { - "origin": "https://www.mikescerealshack.co", + "origin": "https://cdn.mikescerealshack.co", "rtt": 5.454999999999998 }, { - "origin": "https://cdn.mikescerealshack.co", - "rtt": 5.454999999999998 + "origin": "https://www.mikescerealshack.co", + "rtt": 0.0901 } ], "sortedBy": [ @@ -8762,7 +8762,7 @@ }, { "origin": "https://www.mikescerealshack.co", - "serverResponseTime": 569.5899999999999 + "serverResponseTime": 574.9549 }, { "origin": "https://mnl4bjjsnz-dsn.algolia.net", diff --git a/core/test/lib/dependency-graph/simulator/network-analyzer-test.js b/core/test/lib/dependency-graph/simulator/network-analyzer-test.js index 2a74cca89387..02f1401bdbb8 100644 --- a/core/test/lib/dependency-graph/simulator/network-analyzer-test.js +++ b/core/test/lib/dependency-graph/simulator/network-analyzer-test.js @@ -202,6 +202,16 @@ describe('DependencyGraph/Simulator/NetworkAnalyzer', () => { assert.deepStrictEqual(result.get('https://example.com'), expected); }); + it('should use coarse estimates on a per-origin basis', () => { + const records = [ + createRecord({url: 'https://example.com', timing: {connectStart: 1, connectEnd: 100, sendStart: 150}}), + createRecord({url: 'https://example2.com', timing: {sendStart: 150}}), + ]; + const result = NetworkAnalyzer.estimateRTTByOrigin(records); + assert.deepStrictEqual(result.get('https://example.com'), {min: 99, max: 99, avg: 99, median: 99}); + assert.deepStrictEqual(result.get('https://example2.com'), {min: 15, max: 15, avg: 15, median: 15}); + }); + it('should handle untrustworthy connection information', () => { const timing = {sendStart: 150}; const recordA = createRecord({networkRequestTime: 0, networkEndTime: 1, timing, From 98637e85f6b9540a0ccff96210fd159228d740f1 Mon Sep 17 00:00:00 2001 From: Connor Clark Date: Mon, 22 May 2023 16:58:17 -0700 Subject: [PATCH 2/7] lantern baseline --- .../fixtures/lantern-baseline-accuracy.json | 24 ++--- .../lantern-baseline-computed-values.json | 98 +++++++++---------- 2 files changed, 61 insertions(+), 61 deletions(-) diff --git a/core/test/fixtures/lantern-baseline-accuracy.json b/core/test/fixtures/lantern-baseline-accuracy.json index 6e82db2a722a..96636360fbf6 100644 --- a/core/test/fixtures/lantern-baseline-accuracy.json +++ b/core/test/fixtures/lantern-baseline-accuracy.json @@ -1,27 +1,27 @@ { "roughEstimateOfFCP": { - "p50": 0.2880704563650921, - "p90": 0.48970428858956494, + "p50": 0.28936170212765955, + "p90": 0.4879553466509988, "p95": 0.5191288993525603 }, "roughEstimateOfFMP": { - "p50": 0.3123404255319149, + "p50": 0.31948476052249636, "p90": 0.5385564466378778, - "p95": 0.6414781475778751 + "p95": 0.6406490583915669 }, "roughEstimateOfSI": { - "p50": 0.26511005715675545, - "p90": 0.6462556888705007, + "p50": 0.2646236166849082, + "p90": 0.6493506493506493, "p95": 0.9006036782254668 }, "roughEstimateOfTTI": { - "p50": 0.26853932584269663, - "p90": 0.6741321388577828, - "p95": 0.7425119914727305 + "p50": 0.27676284306826177, + "p90": 0.667039168575739, + "p95": 0.7422988097352994 }, "roughEstimateOfLCP": { - "p50": 0.20175125089349535, - "p90": 0.6705274690874942, - "p95": 0.8768898488120951 + "p50": 0.20067905646890635, + "p90": 0.6717796212239787, + "p95": 0.8626966985498303 } } diff --git a/core/test/fixtures/lantern-baseline-computed-values.json b/core/test/fixtures/lantern-baseline-computed-values.json index 447a9cf23794..c0819f368760 100644 --- a/core/test/fixtures/lantern-baseline-computed-values.json +++ b/core/test/fixtures/lantern-baseline-computed-values.json @@ -1,81 +1,81 @@ { "sites": [ {"url": "http://m.iciba.com", "roughEstimateOfFCP": 1744, "optimisticFCP": 1744, "pessimisticFCP": 1744, "roughEstimateOfFMP": 1744, "optimisticFMP": 1744, "pessimisticFMP": 1744, "roughEstimateOfTTI": 7518, "optimisticTTI": 3338, "pessimisticTTI": 11698, "roughEstimateOfSI": 9842, "optimisticSI": 4764, "pessimisticSI": 5265, "roughEstimateOfLCP": 9783, "optimisticLCP": 9342, "pessimisticLCP": 10223, "roughEstimateOfTTFB": 685}, - {"url": "http://www.zol.com.cn/", "roughEstimateOfFCP": 3296, "optimisticFCP": 3296, "pessimisticFCP": 3296, "roughEstimateOfFMP": 3296, "optimisticFMP": 3296, "pessimisticFMP": 3296, "roughEstimateOfTTI": 15560, "optimisticTTI": 14661, "pessimisticTTI": 16459, "roughEstimateOfSI": 12324, "optimisticSI": 4861, "pessimisticSI": 8876, "roughEstimateOfLCP": 4201, "optimisticLCP": 4123, "pessimisticLCP": 4279, "roughEstimateOfTTFB": 648}, - {"url": "https://birdsarentreal.com", "roughEstimateOfFCP": 2950, "optimisticFCP": 2950, "pessimisticFCP": 2950, "roughEstimateOfFMP": 3434, "optimisticFMP": 3111, "pessimisticFMP": 3756, "roughEstimateOfTTI": 13409, "optimisticTTI": 12063, "pessimisticTTI": 14755, "roughEstimateOfSI": 5108, "optimisticSI": 1323, "pessimisticSI": 5393, "roughEstimateOfLCP": 7721, "optimisticLCP": 6959, "pessimisticLCP": 8483, "roughEstimateOfTTFB": 701}, + {"url": "http://www.zol.com.cn/", "roughEstimateOfFCP": 3447, "optimisticFCP": 3447, "pessimisticFCP": 3447, "roughEstimateOfFMP": 3447, "optimisticFMP": 3447, "pessimisticFMP": 3447, "roughEstimateOfTTI": 15991, "optimisticTTI": 15003, "pessimisticTTI": 16979, "roughEstimateOfSI": 12512, "optimisticSI": 4861, "pessimisticSI": 9164, "roughEstimateOfLCP": 4369, "optimisticLCP": 4194, "pessimisticLCP": 4544, "roughEstimateOfTTFB": 648}, + {"url": "https://birdsarentreal.com", "roughEstimateOfFCP": 2962, "optimisticFCP": 2962, "pessimisticFCP": 2962, "roughEstimateOfFMP": 3448, "optimisticFMP": 3124, "pessimisticFMP": 3772, "roughEstimateOfTTI": 13465, "optimisticTTI": 12107, "pessimisticTTI": 14823, "roughEstimateOfSI": 5123, "optimisticSI": 1323, "pessimisticSI": 5417, "roughEstimateOfLCP": 7754, "optimisticLCP": 6986, "pessimisticLCP": 8523, "roughEstimateOfTTFB": 701}, {"url": "https://depositfiles.com/", "roughEstimateOfFCP": 5098, "optimisticFCP": 5098, "pessimisticFCP": 5098, "roughEstimateOfFMP": 5486, "optimisticFMP": 5098, "pessimisticFMP": 5874, "roughEstimateOfTTI": 5982, "optimisticTTI": 5854, "pessimisticTTI": 6109, "roughEstimateOfSI": 7568, "optimisticSI": 2787, "pessimisticSI": 6025, "roughEstimateOfLCP": 6034, "optimisticLCP": 6034, "pessimisticLCP": 6034, "roughEstimateOfTTFB": 907}, - {"url": "https://en-maktoob.yahoo.com/?p=xa", "roughEstimateOfFCP": 1350, "optimisticFCP": 1350, "pessimisticFCP": 1350, "roughEstimateOfFMP": 1366, "optimisticFMP": 1350, "pessimisticFMP": 1383, "roughEstimateOfTTI": 5816, "optimisticTTI": 5163, "pessimisticTTI": 6470, "roughEstimateOfSI": 3643, "optimisticSI": 1039, "pessimisticSI": 3751, "roughEstimateOfLCP": 6844, "optimisticLCP": 6703, "pessimisticLCP": 6984, "roughEstimateOfTTFB": 618}, - {"url": "https://en.softonic.com", "roughEstimateOfFCP": 2187, "optimisticFCP": 2187, "pessimisticFCP": 2187, "roughEstimateOfFMP": 2580, "optimisticFMP": 2187, "pessimisticFMP": 2973, "roughEstimateOfTTI": 31124, "optimisticTTI": 26796, "pessimisticTTI": 35453, "roughEstimateOfSI": 12951, "optimisticSI": 3067, "pessimisticSI": 13703, "roughEstimateOfLCP": 3907, "optimisticLCP": 3498, "pessimisticLCP": 4316, "roughEstimateOfTTFB": 899}, + {"url": "https://en-maktoob.yahoo.com/?p=xa", "roughEstimateOfFCP": 1410, "optimisticFCP": 1410, "pessimisticFCP": 1410, "roughEstimateOfFMP": 1427, "optimisticFMP": 1410, "pessimisticFMP": 1443, "roughEstimateOfTTI": 5959, "optimisticTTI": 5356, "pessimisticTTI": 6563, "roughEstimateOfSI": 3693, "optimisticSI": 1039, "pessimisticSI": 3829, "roughEstimateOfLCP": 7119, "optimisticLCP": 7003, "pessimisticLCP": 7235, "roughEstimateOfTTFB": 618}, + {"url": "https://en.softonic.com", "roughEstimateOfFCP": 2191, "optimisticFCP": 2191, "pessimisticFCP": 2191, "roughEstimateOfFMP": 2584, "optimisticFMP": 2191, "pessimisticFMP": 2977, "roughEstimateOfTTI": 31427, "optimisticTTI": 27015, "pessimisticTTI": 35839, "roughEstimateOfSI": 12996, "optimisticSI": 3067, "pessimisticSI": 13771, "roughEstimateOfLCP": 3915, "optimisticLCP": 3504, "pessimisticLCP": 4325, "roughEstimateOfTTFB": 899}, {"url": "https://gm.58.com/glsanfrancisco-sl/", "roughEstimateOfFCP": 3019, "optimisticFCP": 3019, "pessimisticFCP": 3019, "roughEstimateOfFMP": 3019, "optimisticFMP": 3019, "pessimisticFMP": 3019, "roughEstimateOfTTI": 4785, "optimisticTTI": 4436, "pessimisticTTI": 5134, "roughEstimateOfSI": 4605, "optimisticSI": 1762, "pessimisticSI": 3674, "roughEstimateOfLCP": 5337, "optimisticLCP": 5045, "pessimisticLCP": 5630, "roughEstimateOfTTFB": 787}, {"url": "https://m.facebook.com/", "roughEstimateOfFCP": 2438, "optimisticFCP": 2407, "pessimisticFCP": 2468, "roughEstimateOfFMP": 2438, "optimisticFMP": 2407, "pessimisticFMP": 2468, "roughEstimateOfTTI": 4822, "optimisticTTI": 4217, "pessimisticTTI": 5427, "roughEstimateOfSI": 2685, "optimisticSI": 479, "pessimisticSI": 3484, "roughEstimateOfLCP": 3422, "optimisticLCP": 3391, "pessimisticLCP": 3452, "roughEstimateOfTTFB": 626}, - {"url": "https://m.hexun.com/", "roughEstimateOfFCP": 4446, "optimisticFCP": 4446, "pessimisticFCP": 4446, "roughEstimateOfFMP": 4446, "optimisticFMP": 4446, "pessimisticFMP": 4446, "roughEstimateOfTTI": 13552, "optimisticTTI": 9706, "pessimisticTTI": 17399, "roughEstimateOfSI": 11103, "optimisticSI": 3631, "pessimisticSI": 9644, "roughEstimateOfLCP": 5993, "optimisticLCP": 4825, "pessimisticLCP": 7161, "roughEstimateOfTTFB": 931}, + {"url": "https://m.hexun.com/", "roughEstimateOfFCP": 4446, "optimisticFCP": 4446, "pessimisticFCP": 4446, "roughEstimateOfFMP": 4446, "optimisticFMP": 4446, "pessimisticFMP": 4446, "roughEstimateOfTTI": 13560, "optimisticTTI": 9706, "pessimisticTTI": 17415, "roughEstimateOfSI": 11106, "optimisticSI": 3631, "pessimisticSI": 9650, "roughEstimateOfLCP": 5993, "optimisticLCP": 4825, "pessimisticLCP": 7161, "roughEstimateOfTTFB": 931}, {"url": "https://m.mop.com/", "roughEstimateOfFCP": 2518, "optimisticFCP": 2518, "pessimisticFCP": 2518, "roughEstimateOfFMP": 2518, "optimisticFMP": 2518, "pessimisticFMP": 2518, "roughEstimateOfTTI": 6347, "optimisticTTI": 4869, "pessimisticTTI": 7825, "roughEstimateOfSI": 6129, "optimisticSI": 2399, "pessimisticSI": 4646, "roughEstimateOfLCP": 3548, "optimisticLCP": 3398, "pessimisticLCP": 3698, "roughEstimateOfTTFB": 859}, {"url": "https://m.sogou.com/", "roughEstimateOfFCP": 2151, "optimisticFCP": 2151, "pessimisticFCP": 2151, "roughEstimateOfFMP": 3077, "optimisticFMP": 2151, "pessimisticFMP": 4002, "roughEstimateOfTTI": 4313, "optimisticTTI": 4199, "pessimisticTTI": 4426, "roughEstimateOfSI": 8305, "optimisticSI": 4734, "pessimisticSI": 2965, "roughEstimateOfLCP": 5123, "optimisticLCP": 4937, "pessimisticLCP": 5309, "roughEstimateOfTTFB": 778}, {"url": "https://m.youdao.com/", "roughEstimateOfFCP": 1497, "optimisticFCP": 1497, "pessimisticFCP": 1497, "roughEstimateOfFMP": 1497, "optimisticFMP": 1497, "pessimisticFMP": 1497, "roughEstimateOfTTI": 2492, "optimisticTTI": 2348, "pessimisticTTI": 2635, "roughEstimateOfSI": 2371, "optimisticSI": 1152, "pessimisticSI": 1552, "roughEstimateOfLCP": 2304, "optimisticLCP": 2304, "pessimisticLCP": 2304, "roughEstimateOfTTFB": 988}, - {"url": "https://mail.ru/", "roughEstimateOfFCP": 3560, "optimisticFCP": 3560, "pessimisticFCP": 3560, "roughEstimateOfFMP": 3560, "optimisticFMP": 3560, "pessimisticFMP": 3560, "roughEstimateOfTTI": 25123, "optimisticTTI": 19387, "pessimisticTTI": 30859, "roughEstimateOfSI": 9363, "optimisticSI": 2087, "pessimisticSI": 10294, "roughEstimateOfLCP": 4728, "optimisticLCP": 4436, "pessimisticLCP": 5019, "roughEstimateOfTTFB": 763}, - {"url": "https://mobile.twitter.com/", "roughEstimateOfFCP": 1099, "optimisticFCP": 1099, "pessimisticFCP": 1099, "roughEstimateOfFMP": 4836, "optimisticFMP": 4640, "pessimisticFMP": 5032, "roughEstimateOfTTI": 8456, "optimisticTTI": 8376, "pessimisticTTI": 8536, "roughEstimateOfSI": 4458, "optimisticSI": 1283, "pessimisticSI": 4480, "roughEstimateOfLCP": 9394, "optimisticLCP": 9394, "pessimisticLCP": 9394, "roughEstimateOfTTFB": 633}, + {"url": "https://mail.ru/", "roughEstimateOfFCP": 3562, "optimisticFCP": 3562, "pessimisticFCP": 3562, "roughEstimateOfFMP": 3562, "optimisticFMP": 3562, "pessimisticFMP": 3562, "roughEstimateOfTTI": 25151, "optimisticTTI": 19420, "pessimisticTTI": 30881, "roughEstimateOfSI": 9367, "optimisticSI": 2087, "pessimisticSI": 10300, "roughEstimateOfLCP": 4730, "optimisticLCP": 4438, "pessimisticLCP": 5021, "roughEstimateOfTTFB": 763}, + {"url": "https://mobile.twitter.com/", "roughEstimateOfFCP": 1100, "optimisticFCP": 1100, "pessimisticFCP": 1100, "roughEstimateOfFMP": 4843, "optimisticFMP": 4647, "pessimisticFMP": 5039, "roughEstimateOfTTI": 8467, "optimisticTTI": 8387, "pessimisticTTI": 8547, "roughEstimateOfSI": 4462, "optimisticSI": 1283, "pessimisticSI": 4486, "roughEstimateOfLCP": 9326, "optimisticLCP": 9246, "pessimisticLCP": 9406, "roughEstimateOfTTFB": 633}, {"url": "https://noclip.website/", "roughEstimateOfFCP": 14263, "optimisticFCP": 14263, "pessimisticFCP": 14263, "roughEstimateOfFMP": 14263, "optimisticFMP": 14263, "pessimisticFMP": 14263, "roughEstimateOfTTI": 14726, "optimisticTTI": 14726, "pessimisticTTI": 14726, "roughEstimateOfSI": 14263, "optimisticSI": 606, "pessimisticSI": 14263, "roughEstimateOfLCP": 14790, "optimisticLCP": 14790, "pessimisticLCP": 14790, "roughEstimateOfTTFB": 601}, {"url": "https://noclip.website/#bk/01;ZNCA8Ac%7d%7b15_%28S%7bMfXPk;;zm%28[o$K3YC;u%5e~P3%7duru4~L~W9l%7d&a79MC%7d=m$v*_8!_6DhC=", "roughEstimateOfFCP": 14253, "optimisticFCP": 14253, "pessimisticFCP": 14253, "roughEstimateOfFMP": 14253, "optimisticFMP": 14253, "pessimisticFMP": 14253, "roughEstimateOfTTI": 14853, "optimisticTTI": 14764, "pessimisticTTI": 14941, "roughEstimateOfSI": 14253, "optimisticSI": 584, "pessimisticSI": 14253, "roughEstimateOfLCP": 14782, "optimisticLCP": 14782, "pessimisticLCP": 14782, "roughEstimateOfTTFB": 600}, {"url": "https://sfbay.craigslist.org/", "roughEstimateOfFCP": 1519, "optimisticFCP": 1519, "pessimisticFCP": 1519, "roughEstimateOfFMP": 2654, "optimisticFMP": 2654, "pessimisticFMP": 2654, "roughEstimateOfTTI": 2729, "optimisticTTI": 2654, "pessimisticTTI": 2804, "roughEstimateOfSI": 1681, "optimisticSI": 482, "pessimisticSI": 1933, "roughEstimateOfLCP": 1827, "optimisticLCP": 1827, "pessimisticLCP": 1827, "roughEstimateOfTTFB": 604}, - {"url": "https://stripe.com/docs", "roughEstimateOfFCP": 3666, "optimisticFCP": 3666, "pessimisticFCP": 3666, "roughEstimateOfFMP": 3666, "optimisticFMP": 3666, "pessimisticFMP": 3666, "roughEstimateOfTTI": 6884, "optimisticTTI": 6474, "pessimisticTTI": 7295, "roughEstimateOfSI": 4916, "optimisticSI": 1830, "pessimisticSI": 4005, "roughEstimateOfLCP": 4467, "optimisticLCP": 4467, "pessimisticLCP": 4467, "roughEstimateOfTTFB": 1161}, + {"url": "https://stripe.com/docs", "roughEstimateOfFCP": 3670, "optimisticFCP": 3670, "pessimisticFCP": 3670, "roughEstimateOfFMP": 3670, "optimisticFMP": 3670, "pessimisticFMP": 3670, "roughEstimateOfTTI": 6893, "optimisticTTI": 6482, "pessimisticTTI": 7304, "roughEstimateOfSI": 4919, "optimisticSI": 1830, "pessimisticSI": 4010, "roughEstimateOfLCP": 4473, "optimisticLCP": 4473, "pessimisticLCP": 4473, "roughEstimateOfTTFB": 1161}, {"url": "https://wap.sogou.com/", "roughEstimateOfFCP": 2173, "optimisticFCP": 2173, "pessimisticFCP": 2173, "roughEstimateOfFMP": 2992, "optimisticFMP": 2173, "pessimisticFMP": 3812, "roughEstimateOfTTI": 6946, "optimisticTTI": 5404, "pessimisticTTI": 8489, "roughEstimateOfSI": 9543, "optimisticSI": 4895, "pessimisticSI": 4523, "roughEstimateOfLCP": 5067, "optimisticLCP": 4671, "pessimisticLCP": 5463, "roughEstimateOfTTFB": 794}, - {"url": "https://weather.com/", "roughEstimateOfFCP": 3742, "optimisticFCP": 3556, "pessimisticFCP": 3929, "roughEstimateOfFMP": 3742, "optimisticFMP": 3556, "pessimisticFMP": 3929, "roughEstimateOfTTI": 27059, "optimisticTTI": 23206, "pessimisticTTI": 30912, "roughEstimateOfSI": 14541, "optimisticSI": 1582, "pessimisticSI": 19348, "roughEstimateOfLCP": 4116, "optimisticLCP": 3929, "pessimisticLCP": 4302, "roughEstimateOfTTFB": 642}, - {"url": "https://www.4shared.com/", "roughEstimateOfFCP": 3467, "optimisticFCP": 3467, "pessimisticFCP": 3467, "roughEstimateOfFMP": 3974, "optimisticFMP": 3467, "pessimisticFMP": 4481, "roughEstimateOfTTI": 6111, "optimisticTTI": 6025, "pessimisticTTI": 6197, "roughEstimateOfSI": 4126, "optimisticSI": 819, "pessimisticSI": 4969, "roughEstimateOfLCP": 4652, "optimisticLCP": 4652, "pessimisticLCP": 4652, "roughEstimateOfTTFB": 601}, - {"url": "https://www.56.com/", "roughEstimateOfFCP": 2708, "optimisticFCP": 2530, "pessimisticFCP": 2886, "roughEstimateOfFMP": 2708, "optimisticFMP": 2530, "pessimisticFMP": 2886, "roughEstimateOfTTI": 23679, "optimisticTTI": 3783, "pessimisticTTI": 43575, "roughEstimateOfSI": 20290, "optimisticSI": 5195, "pessimisticSI": 20410, "roughEstimateOfLCP": 19321, "optimisticLCP": 5265, "pessimisticLCP": 33376, "roughEstimateOfTTFB": 840}, - {"url": "https://www.addthis.com/", "roughEstimateOfFCP": 2102, "optimisticFCP": 2102, "pessimisticFCP": 2102, "roughEstimateOfFMP": 2102, "optimisticFMP": 2102, "pessimisticFMP": 2102, "roughEstimateOfTTI": 9064, "optimisticTTI": 8605, "pessimisticTTI": 9522, "roughEstimateOfSI": 4922, "optimisticSI": 1375, "pessimisticSI": 4995, "roughEstimateOfLCP": 2622, "optimisticLCP": 2547, "pessimisticLCP": 2698, "roughEstimateOfTTFB": 699}, - {"url": "https://www.alexa.com/", "roughEstimateOfFCP": 3832, "optimisticFCP": 3832, "pessimisticFCP": 3832, "roughEstimateOfFMP": 4446, "optimisticFMP": 4069, "pessimisticFMP": 4824, "roughEstimateOfTTI": 15705, "optimisticTTI": 11547, "pessimisticTTI": 19863, "roughEstimateOfSI": 8055, "optimisticSI": 2373, "pessimisticSI": 7667, "roughEstimateOfLCP": 8788, "optimisticLCP": 8616, "pessimisticLCP": 8961, "roughEstimateOfTTFB": 654}, - {"url": "https://www.amazon.co.jp/", "roughEstimateOfFCP": 2927, "optimisticFCP": 2927, "pessimisticFCP": 2927, "roughEstimateOfFMP": 4025, "optimisticFMP": 2927, "pessimisticFMP": 5123, "roughEstimateOfTTI": 9114, "optimisticTTI": 6218, "pessimisticTTI": 12011, "roughEstimateOfSI": 4642, "optimisticSI": 1079, "pessimisticSI": 5202, "roughEstimateOfLCP": 5049, "optimisticLCP": 4647, "pessimisticLCP": 5451, "roughEstimateOfTTFB": 852}, - {"url": "https://www.att.com/", "roughEstimateOfFCP": 5590, "optimisticFCP": 5139, "pessimisticFCP": 6042, "roughEstimateOfFMP": 5750, "optimisticFMP": 5139, "pessimisticFMP": 6361, "roughEstimateOfTTI": 30035, "optimisticTTI": 27711, "pessimisticTTI": 32359, "roughEstimateOfSI": 9131, "optimisticSI": 1858, "pessimisticSI": 10430, "roughEstimateOfLCP": 13751, "optimisticLCP": 13671, "pessimisticLCP": 13831, "roughEstimateOfTTFB": 651}, + {"url": "https://weather.com/", "roughEstimateOfFCP": 3751, "optimisticFCP": 3564, "pessimisticFCP": 3938, "roughEstimateOfFMP": 3751, "optimisticFMP": 3564, "pessimisticFMP": 3938, "roughEstimateOfTTI": 27167, "optimisticTTI": 23242, "pessimisticTTI": 31092, "roughEstimateOfSI": 14587, "optimisticSI": 1582, "pessimisticSI": 19418, "roughEstimateOfLCP": 4125, "optimisticLCP": 3938, "pessimisticLCP": 4312, "roughEstimateOfTTFB": 642}, + {"url": "https://www.4shared.com/", "roughEstimateOfFCP": 3488, "optimisticFCP": 3488, "pessimisticFCP": 3488, "roughEstimateOfFMP": 3997, "optimisticFMP": 3488, "pessimisticFMP": 4506, "roughEstimateOfTTI": 6149, "optimisticTTI": 6063, "pessimisticTTI": 6236, "roughEstimateOfSI": 4146, "optimisticSI": 819, "pessimisticSI": 4999, "roughEstimateOfLCP": 4679, "optimisticLCP": 4679, "pessimisticLCP": 4679, "roughEstimateOfTTFB": 601}, + {"url": "https://www.56.com/", "roughEstimateOfFCP": 2998, "optimisticFCP": 2793, "pessimisticFCP": 3202, "roughEstimateOfFMP": 2998, "optimisticFMP": 2793, "pessimisticFMP": 3202, "roughEstimateOfTTI": 26347, "optimisticTTI": 4098, "pessimisticTTI": 48596, "roughEstimateOfSI": 21816, "optimisticSI": 5195, "pessimisticSI": 22758, "roughEstimateOfLCP": 21835, "optimisticLCP": 5708, "pessimisticLCP": 37963, "roughEstimateOfTTFB": 840}, + {"url": "https://www.addthis.com/", "roughEstimateOfFCP": 2104, "optimisticFCP": 2104, "pessimisticFCP": 2104, "roughEstimateOfFMP": 2104, "optimisticFMP": 2104, "pessimisticFMP": 2104, "roughEstimateOfTTI": 9077, "optimisticTTI": 8624, "pessimisticTTI": 9531, "roughEstimateOfSI": 4925, "optimisticSI": 1375, "pessimisticSI": 5000, "roughEstimateOfLCP": 2625, "optimisticLCP": 2549, "pessimisticLCP": 2701, "roughEstimateOfTTFB": 699}, + {"url": "https://www.alexa.com/", "roughEstimateOfFCP": 3839, "optimisticFCP": 3839, "pessimisticFCP": 3839, "roughEstimateOfFMP": 4507, "optimisticFMP": 4184, "pessimisticFMP": 4831, "roughEstimateOfTTI": 15734, "optimisticTTI": 11567, "pessimisticTTI": 19901, "roughEstimateOfSI": 8065, "optimisticSI": 2373, "pessimisticSI": 7681, "roughEstimateOfLCP": 8807, "optimisticLCP": 8634, "pessimisticLCP": 8980, "roughEstimateOfTTFB": 654}, + {"url": "https://www.amazon.co.jp/", "roughEstimateOfFCP": 2940, "optimisticFCP": 2940, "pessimisticFCP": 2940, "roughEstimateOfFMP": 4042, "optimisticFMP": 2940, "pessimisticFMP": 5143, "roughEstimateOfTTI": 9041, "optimisticTTI": 6002, "pessimisticTTI": 12080, "roughEstimateOfSI": 4637, "optimisticSI": 1079, "pessimisticSI": 5194, "roughEstimateOfLCP": 5192, "optimisticLCP": 4670, "pessimisticLCP": 5714, "roughEstimateOfTTFB": 852}, + {"url": "https://www.att.com/", "roughEstimateOfFCP": 5457, "optimisticFCP": 5005, "pessimisticFCP": 5910, "roughEstimateOfFMP": 5698, "optimisticFMP": 5005, "pessimisticFMP": 6391, "roughEstimateOfTTI": 30075, "optimisticTTI": 27319, "pessimisticTTI": 32831, "roughEstimateOfSI": 9164, "optimisticSI": 1858, "pessimisticSI": 10482, "roughEstimateOfLCP": 13817, "optimisticLCP": 13737, "pessimisticLCP": 13897, "roughEstimateOfTTFB": 651}, {"url": "https://www.bing.com/", "roughEstimateOfFCP": 962, "optimisticFCP": 962, "pessimisticFCP": 962, "roughEstimateOfFMP": 1339, "optimisticFMP": 962, "pessimisticFMP": 1717, "roughEstimateOfTTI": 2491, "optimisticTTI": 2241, "pessimisticTTI": 2741, "roughEstimateOfSI": 1565, "optimisticSI": 467, "pessimisticSI": 1788, "roughEstimateOfLCP": 1548, "optimisticLCP": 1262, "pessimisticLCP": 1834, "roughEstimateOfTTFB": 608}, - {"url": "https://www.blogger.com/about/", "roughEstimateOfFCP": 1528, "optimisticFCP": 1528, "pessimisticFCP": 1528, "roughEstimateOfFMP": 2103, "optimisticFMP": 1953, "pessimisticFMP": 2253, "roughEstimateOfTTI": 2245, "optimisticTTI": 2216, "pessimisticTTI": 2274, "roughEstimateOfSI": 6825, "optimisticSI": 4188, "pessimisticSI": 1865, "roughEstimateOfLCP": 2377, "optimisticLCP": 2274, "pessimisticLCP": 2480, "roughEstimateOfTTFB": 603}, - {"url": "https://www.cnet.com/", "roughEstimateOfFCP": 2575, "optimisticFCP": 2215, "pessimisticFCP": 2934, "roughEstimateOfFMP": 2811, "optimisticFMP": 2536, "pessimisticFMP": 3085, "roughEstimateOfTTI": 43130, "optimisticTTI": 39828, "pessimisticTTI": 46433, "roughEstimateOfSI": 15812, "optimisticSI": 1339, "pessimisticSI": 21828, "roughEstimateOfLCP": 4259, "optimisticLCP": 4179, "pessimisticLCP": 4339, "roughEstimateOfTTFB": 608}, - {"url": "https://www.codewars.com", "roughEstimateOfFCP": 2239, "optimisticFCP": 2239, "pessimisticFCP": 2239, "roughEstimateOfFMP": 3431, "optimisticFMP": 2407, "pessimisticFMP": 4455, "roughEstimateOfTTI": 8773, "optimisticTTI": 7002, "pessimisticTTI": 10543, "roughEstimateOfSI": 3990, "optimisticSI": 834, "pessimisticSI": 4728, "roughEstimateOfLCP": 9584, "optimisticLCP": 9261, "pessimisticLCP": 9907, "roughEstimateOfTTFB": 609}, - {"url": "https://www.dawn.com/", "roughEstimateOfFCP": 2573, "optimisticFCP": 2250, "pessimisticFCP": 2897, "roughEstimateOfFMP": 2816, "optimisticFMP": 2573, "pessimisticFMP": 3059, "roughEstimateOfTTI": 25689, "optimisticTTI": 23528, "pessimisticTTI": 27850, "roughEstimateOfSI": 10403, "optimisticSI": 1332, "pessimisticSI": 13519, "roughEstimateOfLCP": 3868, "optimisticLCP": 3221, "pessimisticLCP": 4516, "roughEstimateOfTTFB": 652}, - {"url": "https://www.deviantart.com/", "roughEstimateOfFCP": 2920, "optimisticFCP": 2920, "pessimisticFCP": 2920, "roughEstimateOfFMP": 2920, "optimisticFMP": 2920, "pessimisticFMP": 2920, "roughEstimateOfTTI": 13172, "optimisticTTI": 11356, "pessimisticTTI": 14989, "roughEstimateOfSI": 3085, "optimisticSI": 996, "pessimisticSI": 2986, "roughEstimateOfLCP": 12002, "optimisticLCP": 10543, "pessimisticLCP": 13462, "roughEstimateOfTTFB": 1009}, - {"url": "https://www.domaintools.com/", "roughEstimateOfFCP": 3226, "optimisticFCP": 3226, "pessimisticFCP": 3226, "roughEstimateOfFMP": 4803, "optimisticFMP": 3423, "pessimisticFMP": 6184, "roughEstimateOfTTI": 10843, "optimisticTTI": 10385, "pessimisticTTI": 11300, "roughEstimateOfSI": 7206, "optimisticSI": 3235, "pessimisticSI": 4504, "roughEstimateOfLCP": 7170, "optimisticLCP": 7170, "pessimisticLCP": 7170, "roughEstimateOfTTFB": 2351}, - {"url": "https://www.ebay.com/", "roughEstimateOfFCP": 2141, "optimisticFCP": 2141, "pessimisticFCP": 2141, "roughEstimateOfFMP": 2460, "optimisticFMP": 2460, "pessimisticFMP": 2460, "roughEstimateOfTTI": 16501, "optimisticTTI": 14664, "pessimisticTTI": 18338, "roughEstimateOfSI": 4339, "optimisticSI": 628, "pessimisticSI": 5708, "roughEstimateOfLCP": 2938, "optimisticLCP": 2460, "pessimisticLCP": 3416, "roughEstimateOfTTFB": 699}, + {"url": "https://www.blogger.com/about/", "roughEstimateOfFCP": 1533, "optimisticFCP": 1533, "pessimisticFCP": 1533, "roughEstimateOfFMP": 2106, "optimisticFMP": 1956, "pessimisticFMP": 2256, "roughEstimateOfTTI": 2251, "optimisticTTI": 2222, "pessimisticTTI": 2280, "roughEstimateOfSI": 6828, "optimisticSI": 4188, "pessimisticSI": 1870, "roughEstimateOfLCP": 2385, "optimisticLCP": 2280, "pessimisticLCP": 2489, "roughEstimateOfTTFB": 603}, + {"url": "https://www.cnet.com/", "roughEstimateOfFCP": 2578, "optimisticFCP": 2218, "pessimisticFCP": 2938, "roughEstimateOfFMP": 2814, "optimisticFMP": 2539, "pessimisticFMP": 3089, "roughEstimateOfTTI": 43169, "optimisticTTI": 39862, "pessimisticTTI": 46476, "roughEstimateOfSI": 15833, "optimisticSI": 1339, "pessimisticSI": 21859, "roughEstimateOfLCP": 4265, "optimisticLCP": 4185, "pessimisticLCP": 4346, "roughEstimateOfTTFB": 608}, + {"url": "https://www.codewars.com", "roughEstimateOfFCP": 2248, "optimisticFCP": 2248, "pessimisticFCP": 2248, "roughEstimateOfFMP": 3453, "optimisticFMP": 2422, "pessimisticFMP": 4483, "roughEstimateOfTTI": 8825, "optimisticTTI": 7042, "pessimisticTTI": 10608, "roughEstimateOfSI": 4008, "optimisticSI": 834, "pessimisticSI": 4755, "roughEstimateOfLCP": 9643, "optimisticLCP": 9318, "pessimisticLCP": 9968, "roughEstimateOfTTFB": 609}, + {"url": "https://www.dawn.com/", "roughEstimateOfFCP": 2588, "optimisticFCP": 2262, "pessimisticFCP": 2914, "roughEstimateOfFMP": 2832, "optimisticFMP": 2588, "pessimisticFMP": 3077, "roughEstimateOfTTI": 25693, "optimisticTTI": 23532, "pessimisticTTI": 27855, "roughEstimateOfSI": 10399, "optimisticSI": 1332, "pessimisticSI": 13514, "roughEstimateOfLCP": 3892, "optimisticLCP": 3240, "pessimisticLCP": 4543, "roughEstimateOfTTFB": 652}, + {"url": "https://www.deviantart.com/", "roughEstimateOfFCP": 2926, "optimisticFCP": 2926, "pessimisticFCP": 2926, "roughEstimateOfFMP": 2926, "optimisticFMP": 2926, "pessimisticFMP": 2926, "roughEstimateOfTTI": 13024, "optimisticTTI": 11062, "pessimisticTTI": 14985, "roughEstimateOfSI": 3089, "optimisticSI": 996, "pessimisticSI": 2992, "roughEstimateOfLCP": 11953, "optimisticLCP": 10408, "pessimisticLCP": 13497, "roughEstimateOfTTFB": 1009}, + {"url": "https://www.domaintools.com/", "roughEstimateOfFCP": 3236, "optimisticFCP": 3236, "pessimisticFCP": 3236, "roughEstimateOfFMP": 4819, "optimisticFMP": 3433, "pessimisticFMP": 6205, "roughEstimateOfTTI": 10881, "optimisticTTI": 10421, "pessimisticTTI": 11341, "roughEstimateOfSI": 7213, "optimisticSI": 3235, "pessimisticSI": 4515, "roughEstimateOfLCP": 7194, "optimisticLCP": 7194, "pessimisticLCP": 7194, "roughEstimateOfTTFB": 2351}, + {"url": "https://www.ebay.com/", "roughEstimateOfFCP": 2142, "optimisticFCP": 2142, "pessimisticFCP": 2142, "roughEstimateOfFMP": 2461, "optimisticFMP": 2461, "pessimisticFMP": 2461, "roughEstimateOfTTI": 16537, "optimisticTTI": 14670, "pessimisticTTI": 18404, "roughEstimateOfSI": 4328, "optimisticSI": 628, "pessimisticSI": 5691, "roughEstimateOfLCP": 2940, "optimisticLCP": 2461, "pessimisticLCP": 3419, "roughEstimateOfTTFB": 699}, {"url": "https://www.ebs.in/IPS/", "roughEstimateOfFCP": 6387, "optimisticFCP": 4297, "pessimisticFCP": 8476, "roughEstimateOfFMP": 7012, "optimisticFMP": 4724, "pessimisticFMP": 9300, "roughEstimateOfTTI": 14724, "optimisticTTI": 7479, "pessimisticTTI": 21970, "roughEstimateOfSI": 13538, "optimisticSI": 4003, "pessimisticSI": 12590, "roughEstimateOfLCP": 10858, "optimisticLCP": 6114, "pessimisticLCP": 15602, "roughEstimateOfTTFB": 1223}, - {"url": "https://www.espn.com/", "roughEstimateOfFCP": 3902, "optimisticFCP": 3902, "pessimisticFCP": 3902, "roughEstimateOfFMP": 5310, "optimisticFMP": 3902, "pessimisticFMP": 6717, "roughEstimateOfTTI": 36213, "optimisticTTI": 33512, "pessimisticTTI": 38914, "roughEstimateOfSI": 13246, "optimisticSI": 2989, "pessimisticSI": 14324, "roughEstimateOfLCP": 7755, "optimisticLCP": 7355, "pessimisticLCP": 8154, "roughEstimateOfTTFB": 637}, - {"url": "https://www.flipkart.com", "roughEstimateOfFCP": 2352, "optimisticFCP": 2352, "pessimisticFCP": 2352, "roughEstimateOfFMP": 3911, "optimisticFMP": 2512, "pessimisticFMP": 5310, "roughEstimateOfTTI": 12413, "optimisticTTI": 10223, "pessimisticTTI": 14602, "roughEstimateOfSI": 7379, "optimisticSI": 3188, "pessimisticSI": 4870, "roughEstimateOfLCP": 11701, "optimisticLCP": 10714, "pessimisticLCP": 12688, "roughEstimateOfTTFB": 922}, - {"url": "https://www.foxnews.com/", "roughEstimateOfFCP": 3685, "optimisticFCP": 3685, "pessimisticFCP": 3685, "roughEstimateOfFMP": 3685, "optimisticFMP": 3685, "pessimisticFMP": 3685, "roughEstimateOfTTI": 23688, "optimisticTTI": 20251, "pessimisticTTI": 27126, "roughEstimateOfSI": 12385, "optimisticSI": 1187, "pessimisticSI": 16882, "roughEstimateOfLCP": 5666, "optimisticLCP": 5509, "pessimisticLCP": 5824, "roughEstimateOfTTFB": 634}, - {"url": "https://www.gmx.net/", "roughEstimateOfFCP": 2267, "optimisticFCP": 2267, "pessimisticFCP": 2267, "roughEstimateOfFMP": 2267, "optimisticFMP": 2267, "pessimisticFMP": 2267, "roughEstimateOfTTI": 10331, "optimisticTTI": 9956, "pessimisticTTI": 10706, "roughEstimateOfSI": 4425, "optimisticSI": 1327, "pessimisticSI": 4333, "roughEstimateOfLCP": 6855, "optimisticLCP": 6855, "pessimisticLCP": 6855, "roughEstimateOfTTFB": 611}, - {"url": "https://www.hatena.ne.jp/", "roughEstimateOfFCP": 1739, "optimisticFCP": 1739, "pessimisticFCP": 1739, "roughEstimateOfFMP": 2760, "optimisticFMP": 2258, "pessimisticFMP": 3261, "roughEstimateOfTTI": 15779, "optimisticTTI": 12406, "pessimisticTTI": 19151, "roughEstimateOfSI": 8949, "optimisticSI": 2323, "pessimisticSI": 9149, "roughEstimateOfLCP": 5572, "optimisticLCP": 4739, "pessimisticLCP": 6404, "roughEstimateOfTTFB": 877}, + {"url": "https://www.espn.com/", "roughEstimateOfFCP": 3910, "optimisticFCP": 3910, "pessimisticFCP": 3910, "roughEstimateOfFMP": 5320, "optimisticFMP": 3910, "pessimisticFMP": 6731, "roughEstimateOfTTI": 36291, "optimisticTTI": 33591, "pessimisticTTI": 38991, "roughEstimateOfSI": 13266, "optimisticSI": 2989, "pessimisticSI": 14356, "roughEstimateOfLCP": 7771, "optimisticLCP": 7371, "pessimisticLCP": 8171, "roughEstimateOfTTFB": 637}, + {"url": "https://www.flipkart.com", "roughEstimateOfFCP": 2367, "optimisticFCP": 2367, "pessimisticFCP": 2367, "roughEstimateOfFMP": 3939, "optimisticFMP": 2528, "pessimisticFMP": 5349, "roughEstimateOfTTI": 12626, "optimisticTTI": 10335, "pessimisticTTI": 14916, "roughEstimateOfSI": 7407, "optimisticSI": 3188, "pessimisticSI": 4913, "roughEstimateOfLCP": 11750, "optimisticLCP": 10673, "pessimisticLCP": 12827, "roughEstimateOfTTFB": 922}, + {"url": "https://www.foxnews.com/", "roughEstimateOfFCP": 3692, "optimisticFCP": 3692, "pessimisticFCP": 3692, "roughEstimateOfFMP": 3692, "optimisticFMP": 3692, "pessimisticFMP": 3692, "roughEstimateOfTTI": 23711, "optimisticTTI": 20278, "pessimisticTTI": 27144, "roughEstimateOfSI": 12429, "optimisticSI": 1187, "pessimisticSI": 16950, "roughEstimateOfLCP": 5682, "optimisticLCP": 5523, "pessimisticLCP": 5841, "roughEstimateOfTTFB": 634}, + {"url": "https://www.gmx.net/", "roughEstimateOfFCP": 2345, "optimisticFCP": 2345, "pessimisticFCP": 2345, "roughEstimateOfFMP": 2345, "optimisticFMP": 2345, "pessimisticFMP": 2345, "roughEstimateOfTTI": 10347, "optimisticTTI": 9948, "pessimisticTTI": 10746, "roughEstimateOfSI": 4452, "optimisticSI": 1327, "pessimisticSI": 4376, "roughEstimateOfLCP": 7124, "optimisticLCP": 7103, "pessimisticLCP": 7146, "roughEstimateOfTTFB": 611}, + {"url": "https://www.hatena.ne.jp/", "roughEstimateOfFCP": 1743, "optimisticFCP": 1743, "pessimisticFCP": 1743, "roughEstimateOfFMP": 2768, "optimisticFMP": 2265, "pessimisticFMP": 3272, "roughEstimateOfTTI": 15852, "optimisticTTI": 12460, "pessimisticTTI": 19244, "roughEstimateOfSI": 8974, "optimisticSI": 2323, "pessimisticSI": 9187, "roughEstimateOfLCP": 5595, "optimisticLCP": 4758, "pessimisticLCP": 6433, "roughEstimateOfTTFB": 877}, {"url": "https://www.hulu.com/welcome", "roughEstimateOfFCP": 3938, "optimisticFCP": 3777, "pessimisticFCP": 4098, "roughEstimateOfFMP": 8045, "optimisticFMP": 7724, "pessimisticFMP": 8366, "roughEstimateOfTTI": 16748, "optimisticTTI": 15598, "pessimisticTTI": 17897, "roughEstimateOfSI": 5944, "optimisticSI": 920, "pessimisticSI": 7547, "roughEstimateOfLCP": 4098, "optimisticLCP": 4098, "pessimisticLCP": 4098, "roughEstimateOfTTFB": 612}, {"url": "https://www.ifeng.com/", "roughEstimateOfFCP": 5148, "optimisticFCP": 5148, "pessimisticFCP": 5148, "roughEstimateOfFMP": 5148, "optimisticFMP": 5148, "pessimisticFMP": 5148, "roughEstimateOfTTI": 6096, "optimisticTTI": 5864, "pessimisticTTI": 6329, "roughEstimateOfSI": 7291, "optimisticSI": 2997, "pessimisticSI": 5148, "roughEstimateOfLCP": 5556, "optimisticLCP": 5556, "pessimisticLCP": 5556, "roughEstimateOfTTFB": 1653}, - {"url": "https://www.imageshack.us/login", "roughEstimateOfFCP": 2301, "optimisticFCP": 2299, "pessimisticFCP": 2302, "roughEstimateOfFMP": 2301, "optimisticFMP": 2299, "pessimisticFMP": 2302, "roughEstimateOfTTI": 7889, "optimisticTTI": 7646, "pessimisticTTI": 8132, "roughEstimateOfSI": 4773, "optimisticSI": 1491, "pessimisticSI": 4517, "roughEstimateOfLCP": 3637, "optimisticLCP": 3452, "pessimisticLCP": 3822, "roughEstimateOfTTFB": 603}, - {"url": "https://www.instagram.com/", "roughEstimateOfFCP": 1056, "optimisticFCP": 1056, "pessimisticFCP": 1056, "roughEstimateOfFMP": 3593, "optimisticFMP": 3518, "pessimisticFMP": 3668, "roughEstimateOfTTI": 5746, "optimisticTTI": 5140, "pessimisticTTI": 6352, "roughEstimateOfSI": 2827, "optimisticSI": 822, "pessimisticSI": 2964, "roughEstimateOfLCP": 5107, "optimisticLCP": 4957, "pessimisticLCP": 5257, "roughEstimateOfTTFB": 606}, + {"url": "https://www.imageshack.us/login", "roughEstimateOfFCP": 2311, "optimisticFCP": 2310, "pessimisticFCP": 2313, "roughEstimateOfFMP": 2311, "optimisticFMP": 2310, "pessimisticFMP": 2313, "roughEstimateOfTTI": 7920, "optimisticTTI": 7670, "pessimisticTTI": 8169, "roughEstimateOfSI": 4787, "optimisticSI": 1491, "pessimisticSI": 4539, "roughEstimateOfLCP": 3652, "optimisticLCP": 3466, "pessimisticLCP": 3838, "roughEstimateOfTTFB": 603}, + {"url": "https://www.instagram.com/", "roughEstimateOfFCP": 1103, "optimisticFCP": 1103, "pessimisticFCP": 1103, "roughEstimateOfFMP": 3688, "optimisticFMP": 3688, "pessimisticFMP": 3688, "roughEstimateOfTTI": 5845, "optimisticTTI": 5216, "pessimisticTTI": 6475, "roughEstimateOfSI": 2900, "optimisticSI": 822, "pessimisticSI": 3077, "roughEstimateOfLCP": 5169, "optimisticLCP": 5089, "pessimisticLCP": 5248, "roughEstimateOfTTFB": 606}, {"url": "https://www.irs.gov/", "roughEstimateOfFCP": 2022, "optimisticFCP": 2022, "pessimisticFCP": 2022, "roughEstimateOfFMP": 3229, "optimisticFMP": 2788, "pessimisticFMP": 3670, "roughEstimateOfTTI": 15149, "optimisticTTI": 13822, "pessimisticTTI": 16476, "roughEstimateOfSI": 4953, "optimisticSI": 818, "pessimisticSI": 6242, "roughEstimateOfLCP": 4217, "optimisticLCP": 3724, "pessimisticLCP": 4711, "roughEstimateOfTTFB": 684}, {"url": "https://www.java.com/en/", "roughEstimateOfFCP": 961, "optimisticFCP": 961, "pessimisticFCP": 961, "roughEstimateOfFMP": 961, "optimisticFMP": 961, "pessimisticFMP": 961, "roughEstimateOfTTI": 3252, "optimisticTTI": 3102, "pessimisticTTI": 3402, "roughEstimateOfSI": 1207, "optimisticSI": 484, "pessimisticSI": 1199, "roughEstimateOfLCP": 3050, "optimisticLCP": 3050, "pessimisticLCP": 3050, "roughEstimateOfTTFB": 643}, {"url": "https://www.linkedin.com/", "roughEstimateOfFCP": 1903, "optimisticFCP": 1903, "pessimisticFCP": 1903, "roughEstimateOfFMP": 1903, "optimisticFMP": 1903, "pessimisticFMP": 1903, "roughEstimateOfTTI": 11294, "optimisticTTI": 9700, "pessimisticTTI": 12888, "roughEstimateOfSI": 2073, "optimisticSI": 655, "pessimisticSI": 2164, "roughEstimateOfLCP": 2196, "optimisticLCP": 2155, "pessimisticLCP": 2237, "roughEstimateOfTTFB": 656}, - {"url": "https://www.metacafe.com/", "roughEstimateOfFCP": 1907, "optimisticFCP": 1907, "pessimisticFCP": 1907, "roughEstimateOfFMP": 1907, "optimisticFMP": 1907, "pessimisticFMP": 1907, "roughEstimateOfTTI": 6314, "optimisticTTI": 5838, "pessimisticTTI": 6791, "roughEstimateOfSI": 3457, "optimisticSI": 769, "pessimisticSI": 4047, "roughEstimateOfLCP": 4889, "optimisticLCP": 4889, "pessimisticLCP": 4889, "roughEstimateOfTTFB": 621}, - {"url": "https://www.mgid.com/ru", "roughEstimateOfFCP": 2051, "optimisticFCP": 2051, "pessimisticFCP": 2051, "roughEstimateOfFMP": 4424, "optimisticFMP": 4024, "pessimisticFMP": 4823, "roughEstimateOfTTI": 15285, "optimisticTTI": 14284, "pessimisticTTI": 16287, "roughEstimateOfSI": 6269, "optimisticSI": 983, "pessimisticSI": 7913, "roughEstimateOfLCP": 8420, "optimisticLCP": 7861, "pessimisticLCP": 8980, "roughEstimateOfTTFB": 648}, - {"url": "https://www.mlb.com/", "roughEstimateOfFCP": 3027, "optimisticFCP": 3027, "pessimisticFCP": 3027, "roughEstimateOfFMP": 3027, "optimisticFMP": 3027, "pessimisticFMP": 3027, "roughEstimateOfTTI": 38101, "optimisticTTI": 29476, "pessimisticTTI": 46726, "roughEstimateOfSI": 19208, "optimisticSI": 1316, "pessimisticSI": 27103, "roughEstimateOfLCP": 4637, "optimisticLCP": 4315, "pessimisticLCP": 4959, "roughEstimateOfTTFB": 604}, + {"url": "https://www.metacafe.com/", "roughEstimateOfFCP": 1908, "optimisticFCP": 1908, "pessimisticFCP": 1908, "roughEstimateOfFMP": 1908, "optimisticFMP": 1908, "pessimisticFMP": 1908, "roughEstimateOfTTI": 6319, "optimisticTTI": 5841, "pessimisticTTI": 6796, "roughEstimateOfSI": 3459, "optimisticSI": 769, "pessimisticSI": 4050, "roughEstimateOfLCP": 4892, "optimisticLCP": 4892, "pessimisticLCP": 4892, "roughEstimateOfTTFB": 621}, + {"url": "https://www.mgid.com/ru", "roughEstimateOfFCP": 2063, "optimisticFCP": 2063, "pessimisticFCP": 2063, "roughEstimateOfFMP": 4456, "optimisticFMP": 4053, "pessimisticFMP": 4858, "roughEstimateOfTTI": 15378, "optimisticTTI": 14360, "pessimisticTTI": 16396, "roughEstimateOfSI": 6290, "optimisticSI": 983, "pessimisticSI": 7944, "roughEstimateOfLCP": 8322, "optimisticLCP": 7758, "pessimisticLCP": 8886, "roughEstimateOfTTFB": 648}, + {"url": "https://www.mlb.com/", "roughEstimateOfFCP": 3034, "optimisticFCP": 3034, "pessimisticFCP": 3034, "roughEstimateOfFMP": 3034, "optimisticFMP": 3034, "pessimisticFMP": 3034, "roughEstimateOfTTI": 38215, "optimisticTTI": 30243, "pessimisticTTI": 46187, "roughEstimateOfSI": 19128, "optimisticSI": 1316, "pessimisticSI": 26979, "roughEstimateOfLCP": 4649, "optimisticLCP": 4326, "pessimisticLCP": 4972, "roughEstimateOfTTFB": 604}, {"url": "https://www.mozilla.org/en-US/", "roughEstimateOfFCP": 2359, "optimisticFCP": 2359, "pessimisticFCP": 2359, "roughEstimateOfFMP": 2359, "optimisticFMP": 2359, "pessimisticFMP": 2359, "roughEstimateOfTTI": 5647, "optimisticTTI": 5247, "pessimisticTTI": 6047, "roughEstimateOfSI": 3235, "optimisticSI": 801, "pessimisticSI": 3638, "roughEstimateOfLCP": 5703, "optimisticLCP": 5359, "pessimisticLCP": 6047, "roughEstimateOfTTFB": 607}, - {"url": "https://www.msn.com/", "roughEstimateOfFCP": 2240, "optimisticFCP": 2080, "pessimisticFCP": 2399, "roughEstimateOfFMP": 2584, "optimisticFMP": 2080, "pessimisticFMP": 3088, "roughEstimateOfTTI": 11221, "optimisticTTI": 9986, "pessimisticTTI": 12457, "roughEstimateOfSI": 5468, "optimisticSI": 1381, "pessimisticSI": 5823, "roughEstimateOfLCP": 3454, "optimisticLCP": 3341, "pessimisticLCP": 3566, "roughEstimateOfTTFB": 637}, + {"url": "https://www.msn.com/", "roughEstimateOfFCP": 2174, "optimisticFCP": 2094, "pessimisticFCP": 2255, "roughEstimateOfFMP": 2521, "optimisticFMP": 2094, "pessimisticFMP": 2948, "roughEstimateOfTTI": 11300, "optimisticTTI": 10051, "pessimisticTTI": 12548, "roughEstimateOfSI": 5459, "optimisticSI": 1381, "pessimisticSI": 5809, "roughEstimateOfLCP": 3317, "optimisticLCP": 3204, "pessimisticLCP": 3430, "roughEstimateOfTTFB": 637}, {"url": "https://www.netflix.com/", "roughEstimateOfFCP": 4341, "optimisticFCP": 4341, "pessimisticFCP": 4341, "roughEstimateOfFMP": 5453, "optimisticFMP": 5391, "pessimisticFMP": 5514, "roughEstimateOfTTI": 8070, "optimisticTTI": 5724, "pessimisticTTI": 10415, "roughEstimateOfSI": 4440, "optimisticSI": 871, "pessimisticSI": 5340, "roughEstimateOfLCP": 6896, "optimisticLCP": 6296, "pessimisticLCP": 7496, "roughEstimateOfTTFB": 609}, - {"url": "https://www.nih.gov/", "roughEstimateOfFCP": 4176, "optimisticFCP": 4130, "pessimisticFCP": 4221, "roughEstimateOfFMP": 4915, "optimisticFMP": 4374, "pessimisticFMP": 5457, "roughEstimateOfTTI": 6662, "optimisticTTI": 5650, "pessimisticTTI": 7674, "roughEstimateOfSI": 4631, "optimisticSI": 830, "pessimisticSI": 5722, "roughEstimateOfLCP": 6834, "optimisticLCP": 6175, "pessimisticLCP": 7493, "roughEstimateOfTTFB": 604}, - {"url": "https://www.ning.com/", "roughEstimateOfFCP": 2097, "optimisticFCP": 2097, "pessimisticFCP": 2097, "roughEstimateOfFMP": 3202, "optimisticFMP": 2492, "pessimisticFMP": 3912, "roughEstimateOfTTI": 17456, "optimisticTTI": 14638, "pessimisticTTI": 20275, "roughEstimateOfSI": 7398, "optimisticSI": 1385, "pessimisticSI": 8783, "roughEstimateOfLCP": 5348, "optimisticLCP": 4660, "pessimisticLCP": 6036, "roughEstimateOfTTFB": 601}, - {"url": "https://www.nokia.com/", "roughEstimateOfFCP": 2448, "optimisticFCP": 2448, "pessimisticFCP": 2448, "roughEstimateOfFMP": 2448, "optimisticFMP": 2448, "pessimisticFMP": 2448, "roughEstimateOfTTI": 12401, "optimisticTTI": 11713, "pessimisticTTI": 13089, "roughEstimateOfSI": 5455, "optimisticSI": 1367, "pessimisticSI": 5834, "roughEstimateOfLCP": 6409, "optimisticLCP": 6409, "pessimisticLCP": 6409, "roughEstimateOfTTFB": 614}, - {"url": "https://www.ocn.ne.jp/", "roughEstimateOfFCP": 3710, "optimisticFCP": 3710, "pessimisticFCP": 3710, "roughEstimateOfFMP": 3710, "optimisticFMP": 3710, "pessimisticFMP": 3710, "roughEstimateOfTTI": 10605, "optimisticTTI": 9646, "pessimisticTTI": 11564, "roughEstimateOfSI": 6081, "optimisticSI": 2266, "pessimisticSI": 4861, "roughEstimateOfLCP": 4710, "optimisticLCP": 4468, "pessimisticLCP": 4951, "roughEstimateOfTTFB": 1581}, - {"url": "https://www.onet.pl/", "roughEstimateOfFCP": 2070, "optimisticFCP": 2070, "pessimisticFCP": 2070, "roughEstimateOfFMP": 2070, "optimisticFMP": 2070, "pessimisticFMP": 2070, "roughEstimateOfTTI": 11812, "optimisticTTI": 11030, "pessimisticTTI": 12593, "roughEstimateOfSI": 5394, "optimisticSI": 1759, "pessimisticSI": 4895, "roughEstimateOfLCP": 3819, "optimisticLCP": 3819, "pessimisticLCP": 3819, "roughEstimateOfTTFB": 600}, - {"url": "https://www.orange.fr/portail", "roughEstimateOfFCP": 4073, "optimisticFCP": 2992, "pessimisticFCP": 5155, "roughEstimateOfFMP": 5042, "optimisticFMP": 3448, "pessimisticFMP": 6636, "roughEstimateOfTTI": 18178, "optimisticTTI": 16713, "pessimisticTTI": 19644, "roughEstimateOfSI": 10588, "optimisticSI": 3925, "pessimisticSI": 8221, "roughEstimateOfLCP": 6854, "optimisticLCP": 6240, "pessimisticLCP": 7468, "roughEstimateOfTTFB": 880}, - {"url": "https://www.partypoker.com/", "roughEstimateOfFCP": 4986, "optimisticFCP": 4986, "pessimisticFCP": 4986, "roughEstimateOfFMP": 4986, "optimisticFMP": 4986, "pessimisticFMP": 4986, "roughEstimateOfTTI": 7247, "optimisticTTI": 5391, "pessimisticTTI": 9102, "roughEstimateOfSI": 6763, "optimisticSI": 2695, "pessimisticSI": 4986, "roughEstimateOfLCP": 7003, "optimisticLCP": 5147, "pessimisticLCP": 8858, "roughEstimateOfTTFB": 1094}, - {"url": "https://www.rakuten.co.jp/", "roughEstimateOfFCP": 3154, "optimisticFCP": 3154, "pessimisticFCP": 3154, "roughEstimateOfFMP": 5624, "optimisticFMP": 3154, "pessimisticFMP": 8094, "roughEstimateOfTTI": 26647, "optimisticTTI": 19850, "pessimisticTTI": 33443, "roughEstimateOfSI": 12156, "optimisticSI": 4212, "pessimisticSI": 10014, "roughEstimateOfLCP": 8480, "optimisticLCP": 8082, "pessimisticLCP": 8878, "roughEstimateOfTTFB": 698}, - {"url": "https://www.reddit.com/", "roughEstimateOfFCP": 2374, "optimisticFCP": 2294, "pessimisticFCP": 2453, "roughEstimateOfFMP": 7724, "optimisticFMP": 5758, "pessimisticFMP": 9689, "roughEstimateOfTTI": 12351, "optimisticTTI": 11054, "pessimisticTTI": 13648, "roughEstimateOfSI": 8397, "optimisticSI": 3340, "pessimisticSI": 6108, "roughEstimateOfLCP": 10673, "optimisticLCP": 9041, "pessimisticLCP": 12305, "roughEstimateOfTTFB": 1017}, - {"url": "https://www.scribd.com/", "roughEstimateOfFCP": 2099, "optimisticFCP": 2099, "pessimisticFCP": 2099, "roughEstimateOfFMP": 2099, "optimisticFMP": 2099, "pessimisticFMP": 2099, "roughEstimateOfTTI": 10282, "optimisticTTI": 9541, "pessimisticTTI": 11023, "roughEstimateOfSI": 4232, "optimisticSI": 873, "pessimisticSI": 5016, "roughEstimateOfLCP": 8049, "optimisticLCP": 7302, "pessimisticLCP": 8797, "roughEstimateOfTTFB": 635}, + {"url": "https://www.nih.gov/", "roughEstimateOfFCP": 4196, "optimisticFCP": 4150, "pessimisticFCP": 4242, "roughEstimateOfFMP": 4941, "optimisticFMP": 4397, "pessimisticFMP": 5485, "roughEstimateOfTTI": 6698, "optimisticTTI": 5680, "pessimisticTTI": 7715, "roughEstimateOfSI": 4650, "optimisticSI": 830, "pessimisticSI": 5751, "roughEstimateOfLCP": 6870, "optimisticLCP": 6207, "pessimisticLCP": 7533, "roughEstimateOfTTFB": 604}, + {"url": "https://www.ning.com/", "roughEstimateOfFCP": 2106, "optimisticFCP": 2106, "pessimisticFCP": 2106, "roughEstimateOfFMP": 3212, "optimisticFMP": 2497, "pessimisticFMP": 3927, "roughEstimateOfTTI": 17380, "optimisticTTI": 14542, "pessimisticTTI": 20218, "roughEstimateOfSI": 7405, "optimisticSI": 1385, "pessimisticSI": 8793, "roughEstimateOfLCP": 5294, "optimisticLCP": 4524, "pessimisticLCP": 6064, "roughEstimateOfTTFB": 601}, + {"url": "https://www.nokia.com/", "roughEstimateOfFCP": 2460, "optimisticFCP": 2460, "pessimisticFCP": 2460, "roughEstimateOfFMP": 2460, "optimisticFMP": 2460, "pessimisticFMP": 2460, "roughEstimateOfTTI": 12447, "optimisticTTI": 11923, "pessimisticTTI": 12971, "roughEstimateOfSI": 5446, "optimisticSI": 1367, "pessimisticSI": 5819, "roughEstimateOfLCP": 6452, "optimisticLCP": 6452, "pessimisticLCP": 6452, "roughEstimateOfTTFB": 614}, + {"url": "https://www.ocn.ne.jp/", "roughEstimateOfFCP": 3720, "optimisticFCP": 3720, "pessimisticFCP": 3720, "roughEstimateOfFMP": 3720, "optimisticFMP": 3720, "pessimisticFMP": 3720, "roughEstimateOfTTI": 10647, "optimisticTTI": 9684, "pessimisticTTI": 11610, "roughEstimateOfSI": 6092, "optimisticSI": 2266, "pessimisticSI": 4877, "roughEstimateOfLCP": 4726, "optimisticLCP": 4484, "pessimisticLCP": 4969, "roughEstimateOfTTFB": 1581}, + {"url": "https://www.onet.pl/", "roughEstimateOfFCP": 2078, "optimisticFCP": 2078, "pessimisticFCP": 2078, "roughEstimateOfFMP": 2078, "optimisticFMP": 2078, "pessimisticFMP": 2078, "roughEstimateOfTTI": 11869, "optimisticTTI": 11083, "pessimisticTTI": 12655, "roughEstimateOfSI": 5401, "optimisticSI": 1759, "pessimisticSI": 4906, "roughEstimateOfLCP": 3834, "optimisticLCP": 3834, "pessimisticLCP": 3834, "roughEstimateOfTTFB": 600}, + {"url": "https://www.orange.fr/portail", "roughEstimateOfFCP": 4085, "optimisticFCP": 3000, "pessimisticFCP": 5170, "roughEstimateOfFMP": 5055, "optimisticFMP": 3459, "pessimisticFMP": 6652, "roughEstimateOfTTI": 18257, "optimisticTTI": 16766, "pessimisticTTI": 19748, "roughEstimateOfSI": 10600, "optimisticSI": 3925, "pessimisticSI": 8238, "roughEstimateOfLCP": 6874, "optimisticLCP": 6260, "pessimisticLCP": 7489, "roughEstimateOfTTFB": 880}, + {"url": "https://www.partypoker.com/", "roughEstimateOfFCP": 4990, "optimisticFCP": 4990, "pessimisticFCP": 4990, "roughEstimateOfFMP": 4990, "optimisticFMP": 4990, "pessimisticFMP": 4990, "roughEstimateOfTTI": 7253, "optimisticTTI": 5396, "pessimisticTTI": 9111, "roughEstimateOfSI": 6766, "optimisticSI": 2695, "pessimisticSI": 4990, "roughEstimateOfLCP": 7009, "optimisticLCP": 5152, "pessimisticLCP": 8867, "roughEstimateOfTTFB": 1094}, + {"url": "https://www.rakuten.co.jp/", "roughEstimateOfFCP": 3165, "optimisticFCP": 3165, "pessimisticFCP": 3165, "roughEstimateOfFMP": 5641, "optimisticFMP": 3165, "pessimisticFMP": 8117, "roughEstimateOfTTI": 26527, "optimisticTTI": 19609, "pessimisticTTI": 33444, "roughEstimateOfSI": 12164, "optimisticSI": 4212, "pessimisticSI": 10026, "roughEstimateOfLCP": 8521, "optimisticLCP": 8121, "pessimisticLCP": 8921, "roughEstimateOfTTFB": 698}, + {"url": "https://www.reddit.com/", "roughEstimateOfFCP": 2375, "optimisticFCP": 2296, "pessimisticFCP": 2455, "roughEstimateOfFMP": 7729, "optimisticFMP": 5762, "pessimisticFMP": 9695, "roughEstimateOfTTI": 12360, "optimisticTTI": 11062, "pessimisticTTI": 13658, "roughEstimateOfSI": 8400, "optimisticSI": 3340, "pessimisticSI": 6113, "roughEstimateOfLCP": 10681, "optimisticLCP": 9048, "pessimisticLCP": 12313, "roughEstimateOfTTFB": 1017}, + {"url": "https://www.scribd.com/", "roughEstimateOfFCP": 2099, "optimisticFCP": 2099, "pessimisticFCP": 2099, "roughEstimateOfFMP": 2099, "optimisticFMP": 2099, "pessimisticFMP": 2099, "roughEstimateOfTTI": 10282, "optimisticTTI": 9541, "pessimisticTTI": 11024, "roughEstimateOfSI": 4232, "optimisticSI": 873, "pessimisticSI": 5016, "roughEstimateOfLCP": 8049, "optimisticLCP": 7302, "pessimisticLCP": 8797, "roughEstimateOfTTFB": 635}, {"url": "https://www.shopping.com/", "roughEstimateOfFCP": 2882, "optimisticFCP": 2488, "pessimisticFCP": 3277, "roughEstimateOfFMP": 2882, "optimisticFMP": 2488, "pessimisticFMP": 3277, "roughEstimateOfTTI": 5569, "optimisticTTI": 5146, "pessimisticTTI": 5991, "roughEstimateOfSI": 3675, "optimisticSI": 1210, "pessimisticSI": 3433, "roughEstimateOfLCP": 4449, "optimisticLCP": 4342, "pessimisticLCP": 4557, "roughEstimateOfTTFB": 612}, - {"url": "https://www.skype.com/en/", "roughEstimateOfFCP": 2497, "optimisticFCP": 2497, "pessimisticFCP": 2497, "roughEstimateOfFMP": 2804, "optimisticFMP": 2497, "pessimisticFMP": 3110, "roughEstimateOfTTI": 6436, "optimisticTTI": 5748, "pessimisticTTI": 7125, "roughEstimateOfSI": 3979, "optimisticSI": 1120, "pessimisticSI": 4093, "roughEstimateOfLCP": 4980, "optimisticLCP": 4904, "pessimisticLCP": 5057, "roughEstimateOfTTFB": 716}, + {"url": "https://www.skype.com/en/", "roughEstimateOfFCP": 2614, "optimisticFCP": 2614, "pessimisticFCP": 2614, "roughEstimateOfFMP": 2862, "optimisticFMP": 2614, "pessimisticFMP": 3109, "roughEstimateOfTTI": 6534, "optimisticTTI": 5792, "pessimisticTTI": 7275, "roughEstimateOfSI": 4026, "optimisticSI": 1120, "pessimisticSI": 4165, "roughEstimateOfLCP": 4962, "optimisticLCP": 4878, "pessimisticLCP": 5046, "roughEstimateOfTTFB": 716}, {"url": "https://www.so-net.ne.jp/m/", "roughEstimateOfFCP": 4202, "optimisticFCP": 3225, "pessimisticFCP": 5179, "roughEstimateOfFMP": 4202, "optimisticFMP": 3225, "pessimisticFMP": 5179, "roughEstimateOfTTI": 9009, "optimisticTTI": 7027, "pessimisticTTI": 10991, "roughEstimateOfSI": 7822, "optimisticSI": 2439, "pessimisticSI": 7165, "roughEstimateOfLCP": 8061, "optimisticLCP": 6910, "pessimisticLCP": 9212, "roughEstimateOfTTFB": 612}, {"url": "https://www.symantec.com/", "roughEstimateOfFCP": 3489, "optimisticFCP": 3303, "pessimisticFCP": 3675, "roughEstimateOfFMP": 3503, "optimisticFMP": 3303, "pessimisticFMP": 3703, "roughEstimateOfTTI": 11261, "optimisticTTI": 8694, "pessimisticTTI": 13829, "roughEstimateOfSI": 6927, "optimisticSI": 2165, "pessimisticSI": 6378, "roughEstimateOfLCP": 10068, "optimisticLCP": 8374, "pessimisticLCP": 11762, "roughEstimateOfTTFB": 666}, - {"url": "https://www.thestar.com.my/", "roughEstimateOfFCP": 3662, "optimisticFCP": 2284, "pessimisticFCP": 5039, "roughEstimateOfFMP": 3662, "optimisticFMP": 2284, "pessimisticFMP": 5039, "roughEstimateOfTTI": 23135, "optimisticTTI": 18925, "pessimisticTTI": 27344, "roughEstimateOfSI": 15084, "optimisticSI": 5315, "pessimisticSI": 12144, "roughEstimateOfLCP": 13694, "optimisticLCP": 12197, "pessimisticLCP": 15192, "roughEstimateOfTTFB": 979}, + {"url": "https://www.thestar.com.my/", "roughEstimateOfFCP": 3657, "optimisticFCP": 2259, "pessimisticFCP": 5056, "roughEstimateOfFMP": 3657, "optimisticFMP": 2259, "pessimisticFMP": 5056, "roughEstimateOfTTI": 23194, "optimisticTTI": 18899, "pessimisticTTI": 27489, "roughEstimateOfSI": 15121, "optimisticSI": 5315, "pessimisticSI": 12201, "roughEstimateOfLCP": 13838, "optimisticLCP": 12412, "pessimisticLCP": 15264, "roughEstimateOfTTFB": 979}, {"url": "https://www.tianya.cn/m/", "roughEstimateOfFCP": 3505, "optimisticFCP": 3505, "pessimisticFCP": 3505, "roughEstimateOfFMP": 3577, "optimisticFMP": 3505, "pessimisticFMP": 3650, "roughEstimateOfTTI": 5341, "optimisticTTI": 5020, "pessimisticTTI": 5663, "roughEstimateOfSI": 14425, "optimisticSI": 8681, "pessimisticSI": 3880, "roughEstimateOfLCP": 7302, "optimisticLCP": 7050, "pessimisticLCP": 7555, "roughEstimateOfTTFB": 871}, {"url": "https://www.torrentz.com/", "roughEstimateOfFCP": 817, "optimisticFCP": 817, "pessimisticFCP": 817, "roughEstimateOfFMP": 817, "optimisticFMP": 817, "pessimisticFMP": 817, "roughEstimateOfTTI": 817, "optimisticTTI": 817, "pessimisticTTI": 817, "roughEstimateOfSI": 863, "optimisticSI": 416, "pessimisticSI": 817, "roughEstimateOfLCP": 817, "optimisticLCP": 817, "pessimisticLCP": 817, "roughEstimateOfTTFB": 608}, {"url": "https://www.tumblr.com/", "roughEstimateOfFCP": 2508, "optimisticFCP": 2508, "pessimisticFCP": 2508, "roughEstimateOfFMP": 2508, "optimisticFMP": 2508, "pessimisticFMP": 2508, "roughEstimateOfTTI": 9689, "optimisticTTI": 9611, "pessimisticTTI": 9767, "roughEstimateOfSI": 4128, "optimisticSI": 628, "pessimisticSI": 5382, "roughEstimateOfLCP": 8679, "optimisticLCP": 8679, "pessimisticLCP": 8679, "roughEstimateOfTTFB": 637}, - {"url": "https://www.twitpic.com/", "roughEstimateOfFCP": 808, "optimisticFCP": 808, "pessimisticFCP": 808, "roughEstimateOfFMP": 808, "optimisticFMP": 808, "pessimisticFMP": 808, "roughEstimateOfTTI": 808, "optimisticTTI": 808, "pessimisticTTI": 808, "roughEstimateOfSI": 808, "optimisticSI": 121, "pessimisticSI": 849, "roughEstimateOfLCP": 808, "optimisticLCP": 808, "pessimisticLCP": 808, "roughEstimateOfTTFB": 601}, - {"url": "https://www.typepad.com/", "roughEstimateOfFCP": 2598, "optimisticFCP": 2598, "pessimisticFCP": 2598, "roughEstimateOfFMP": 3279, "optimisticFMP": 3077, "pessimisticFMP": 3481, "roughEstimateOfTTI": 3600, "optimisticTTI": 3641, "pessimisticTTI": 3558, "roughEstimateOfSI": 3137, "optimisticSI": 1009, "pessimisticSI": 3037, "roughEstimateOfLCP": 6083, "optimisticLCP": 6243, "pessimisticLCP": 5924, "roughEstimateOfTTFB": 789}, - {"url": "https://www.verizonwireless.com/", "roughEstimateOfFCP": 2974, "optimisticFCP": 2974, "pessimisticFCP": 2974, "roughEstimateOfFMP": 4049, "optimisticFMP": 4049, "pessimisticFMP": 4049, "roughEstimateOfTTI": 22724, "optimisticTTI": 21208, "pessimisticTTI": 24239, "roughEstimateOfSI": 5973, "optimisticSI": 870, "pessimisticSI": 7700, "roughEstimateOfLCP": 7109, "optimisticLCP": 7109, "pessimisticLCP": 7109, "roughEstimateOfTTFB": 640}, + {"url": "https://www.twitpic.com/", "roughEstimateOfFCP": 835, "optimisticFCP": 835, "pessimisticFCP": 835, "roughEstimateOfFMP": 835, "optimisticFMP": 835, "pessimisticFMP": 835, "roughEstimateOfTTI": 835, "optimisticTTI": 835, "pessimisticTTI": 835, "roughEstimateOfSI": 835, "optimisticSI": 121, "pessimisticSI": 876, "roughEstimateOfLCP": 835, "optimisticLCP": 835, "pessimisticLCP": 835, "roughEstimateOfTTFB": 601}, + {"url": "https://www.typepad.com/", "roughEstimateOfFCP": 2610, "optimisticFCP": 2610, "pessimisticFCP": 2610, "roughEstimateOfFMP": 3295, "optimisticFMP": 3092, "pessimisticFMP": 3498, "roughEstimateOfTTI": 3617, "optimisticTTI": 3659, "pessimisticTTI": 3575, "roughEstimateOfSI": 3146, "optimisticSI": 1009, "pessimisticSI": 3051, "roughEstimateOfLCP": 6037, "optimisticLCP": 6118, "pessimisticLCP": 5957, "roughEstimateOfTTFB": 789}, + {"url": "https://www.verizonwireless.com/", "roughEstimateOfFCP": 2977, "optimisticFCP": 2977, "pessimisticFCP": 2977, "roughEstimateOfFMP": 4054, "optimisticFMP": 4054, "pessimisticFMP": 4054, "roughEstimateOfTTI": 22674, "optimisticTTI": 21238, "pessimisticTTI": 24110, "roughEstimateOfSI": 5968, "optimisticSI": 870, "pessimisticSI": 7692, "roughEstimateOfLCP": 7119, "optimisticLCP": 7119, "pessimisticLCP": 7119, "roughEstimateOfTTFB": 640}, {"url": "https://www.vevo.com/", "roughEstimateOfFCP": 5291, "optimisticFCP": 5291, "pessimisticFCP": 5291, "roughEstimateOfFMP": 6391, "optimisticFMP": 5619, "pessimisticFMP": 7163, "roughEstimateOfTTI": 20206, "optimisticTTI": 18496, "pessimisticTTI": 21916, "roughEstimateOfSI": 13794, "optimisticSI": 6002, "pessimisticSI": 8679, "roughEstimateOfLCP": 8810, "optimisticLCP": 7814, "pessimisticLCP": 9807, "roughEstimateOfTTFB": 772}, {"url": "https://www.wikipedia.org/", "roughEstimateOfFCP": 1458, "optimisticFCP": 1458, "pessimisticFCP": 1458, "roughEstimateOfFMP": 1472, "optimisticFMP": 1458, "pessimisticFMP": 1487, "roughEstimateOfTTI": 1731, "optimisticTTI": 1593, "pessimisticTTI": 1870, "roughEstimateOfSI": 1610, "optimisticSI": 579, "pessimisticSI": 1614, "roughEstimateOfLCP": 1472, "optimisticLCP": 1458, "pessimisticLCP": 1487, "roughEstimateOfTTFB": 603}, - {"url": "https://www8.hp.com/us/en/home.html", "roughEstimateOfFCP": 4711, "optimisticFCP": 3365, "pessimisticFCP": 6058, "roughEstimateOfFMP": 6662, "optimisticFMP": 4982, "pessimisticFMP": 8343, "roughEstimateOfTTI": 22098, "optimisticTTI": 18555, "pessimisticTTI": 25641, "roughEstimateOfSI": 13357, "optimisticSI": 3856, "pessimisticSI": 12627, "roughEstimateOfLCP": 10778, "optimisticLCP": 10778, "pessimisticLCP": 10778, "roughEstimateOfTTFB": 612} + {"url": "https://www8.hp.com/us/en/home.html", "roughEstimateOfFCP": 4720, "optimisticFCP": 3373, "pessimisticFCP": 6068, "roughEstimateOfFMP": 6679, "optimisticFMP": 4995, "pessimisticFMP": 8364, "roughEstimateOfTTI": 22072, "optimisticTTI": 18600, "pessimisticTTI": 25543, "roughEstimateOfSI": 13346, "optimisticSI": 3856, "pessimisticSI": 12611, "roughEstimateOfLCP": 10807, "optimisticLCP": 10807, "pessimisticLCP": 10807, "roughEstimateOfTTFB": 612} ] } From 00aff99d2e341413978bee79c30ff8bac6241296 Mon Sep 17 00:00:00 2001 From: Connor Clark Date: Tue, 23 May 2023 17:14:40 -0700 Subject: [PATCH 3/7] skip connection estimator if using coarse --- core/lib/dependency-graph/simulator/network-analyzer.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/core/lib/dependency-graph/simulator/network-analyzer.js b/core/lib/dependency-graph/simulator/network-analyzer.js index 9f7163606cff..40c9a882c799 100644 --- a/core/lib/dependency-graph/simulator/network-analyzer.js +++ b/core/lib/dependency-graph/simulator/network-analyzer.js @@ -366,14 +366,16 @@ class NetworkAnalyzer { } } - collectEstimates(this._estimateRTTViaConnectionTiming); + if (!forceCoarseEstimates) { + collectEstimates(this._estimateRTTViaConnectionTiming); + } // Connection timing can be missing for a few reasons: // - Origin was preconnected, which we don't have instrumentation for. // - Trace began recording after a connection has already been established (for example, in timespan mode) // - Perhaps Chrome established a connection already in the background (service worker? Just guessing here) // - Not provided in LR netstack. - if (!originEstimates.length || forceCoarseEstimates) { + if (!originEstimates.length) { if (useDownloadEstimates) { collectEstimates(this._estimateRTTViaDownloadTiming, coarseEstimateMultiplier); } From ccdf122fd4a36c79ea17dfa9ce547edec87b65af Mon Sep 17 00:00:00 2001 From: Connor Clark Date: Tue, 23 May 2023 19:29:43 -0700 Subject: [PATCH 4/7] start preconnect fixture --- .../artifacts/preconnect/page/preconnect.html | 32 +++++++++++ .../artifacts/preconnect/regenerate.js | 54 +++++++++++++++++++ 2 files changed, 86 insertions(+) create mode 100644 core/test/fixtures/artifacts/preconnect/page/preconnect.html create mode 100644 core/test/fixtures/artifacts/preconnect/regenerate.js diff --git a/core/test/fixtures/artifacts/preconnect/page/preconnect.html b/core/test/fixtures/artifacts/preconnect/page/preconnect.html new file mode 100644 index 000000000000..4bb5ab030ffe --- /dev/null +++ b/core/test/fixtures/artifacts/preconnect/page/preconnect.html @@ -0,0 +1,32 @@ + + + + + + + + + + + + +
preconnect
+ + + + diff --git a/core/test/fixtures/artifacts/preconnect/regenerate.js b/core/test/fixtures/artifacts/preconnect/regenerate.js new file mode 100644 index 000000000000..453edd295bca --- /dev/null +++ b/core/test/fixtures/artifacts/preconnect/regenerate.js @@ -0,0 +1,54 @@ +/** + * @license Copyright 2023 The Lighthouse Authors. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + */ + +import {startFlow} from '../../../../index.js'; +import {updateTestFixture} from '../update-test-fixture.js'; + +/** + * @param {import('puppeteer').Page} page + * @param {number} port + */ +async function runUserFlow(page, port) { + const flow = await startFlow(page, { + flags: { + networkQuietThresholdMs: 15000, + }, + }); + + await flow.navigate(`http://localhost:${port}/preconnect.html`); + + return flow; +} + +/** + * @param {LH.Artifacts} artifacts + */ +function verify(artifacts) { + const originWithPreconnect = 'https://fonts.gstatic.com'; + + const responseReceived = artifacts.DevtoolsLog.find(e => + e.method === 'Network.responseReceived' && + e.params.response.url.startsWith(originWithPreconnect)); + if (!responseReceived) throw new Error(`missing response for ${originWithPreconnect}`); + + console.log(responseReceived.params.response.timing); + if (responseReceived.params.response.timing.dnsStart !== -1) { + throw new Error('expected dnsStart to be -1'); + } + + if (responseReceived.params.response.timing.connectStart !== -1) { + throw new Error('expected connectStart to be -1'); + } +} + +await updateTestFixture({ + name: 'preconnect', + about: 'Page with a a preconnect to another origin', + saveTrace: true, + saveDevtoolsLog: true, + runUserFlow, + verify, +}); From 5bc3e8d5809699dbb5c3c4a6a6d139f9f1551e37 Mon Sep 17 00:00:00 2001 From: Connor Clark Date: Wed, 24 May 2023 10:39:26 -0700 Subject: [PATCH 5/7] wip --- .../artifacts/preconnect/page/preconnect.html | 14 ++++++++++---- .../fixtures/artifacts/preconnect/regenerate.js | 5 +++-- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/core/test/fixtures/artifacts/preconnect/page/preconnect.html b/core/test/fixtures/artifacts/preconnect/page/preconnect.html index 4bb5ab030ffe..897adbe5df97 100644 --- a/core/test/fixtures/artifacts/preconnect/page/preconnect.html +++ b/core/test/fixtures/artifacts/preconnect/page/preconnect.html @@ -6,10 +6,8 @@ - - - +