From ddb018c0bf3107bf129bd51ea8ec0a4e7769e32f Mon Sep 17 00:00:00 2001 From: Patrick Hulce Date: Tue, 5 Jun 2018 11:06:24 -0700 Subject: [PATCH 1/9] tests(lantern): add golden lantern test scripts --- .travis.yml | 2 + .../scripts/lantern/diff-expectations.js | 53 +++++++++ .../scripts/lantern/download-traces.sh | 5 + .../scripts/lantern/evaluate-results.js | 7 +- .../scripts/lantern/run-all-expectations.js | 10 +- .../scripts/lantern/update-expectations.js | 44 ++++++++ lighthouse-core/scripts/test-lantern.sh | 34 ++++++ .../test/fixtures/lantern-expectations.json | 103 ++++++++++++++++++ 8 files changed, 252 insertions(+), 6 deletions(-) create mode 100755 lighthouse-core/scripts/lantern/diff-expectations.js create mode 100755 lighthouse-core/scripts/lantern/update-expectations.js create mode 100755 lighthouse-core/scripts/test-lantern.sh create mode 100644 lighthouse-core/test/fixtures/lantern-expectations.json diff --git a/.travis.yml b/.travis.yml index be4e89c109d5..71dbc2ad8998 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,6 +13,7 @@ cache: yarn: true directories: - node_modules + - lantern-data - lighthouse-extension/node_modules - lighthouse-viewer/node_modules - /home/travis/.rvm/gems/ @@ -39,6 +40,7 @@ script: - yarn smoke:silentcoverage - yarn test-extension - yarn test-viewer + - yarn test-lantern # _JAVA_OPTIONS is breaking parsing of compiler output. See #3338. - unset _JAVA_OPTIONS # FIXME(paulirish): re-enable after a roll of LH->CDT diff --git a/lighthouse-core/scripts/lantern/diff-expectations.js b/lighthouse-core/scripts/lantern/diff-expectations.js new file mode 100755 index 000000000000..0fcb17215fb3 --- /dev/null +++ b/lighthouse-core/scripts/lantern/diff-expectations.js @@ -0,0 +1,53 @@ +#!/usr/bin/env node +/** + * @license Copyright 2018 Google Inc. 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. + */ +'use strict'; + +/* eslint-disable no-console */ + +const fs = require('fs'); +const path = require('path'); +const execSync = require('child_process').execSync; + +const COMPUTED_INPUT_ARG = process.argv[2] || './lantern-data/lantern-computed.json'; +const COMPUTED_PATH = path.join(process.cwd(), COMPUTED_INPUT_ARG); +const EXPECTED_PATH = path.join(__dirname, '../../test/fixtures/lantern-expectations.json'); + +const TMP_DIR = path.join(process.cwd(), '.tmp'); +const TMP_COMPUTED = path.join(TMP_DIR, 'computed.json'); +const TMP_EXPECTED = path.join(TMP_DIR, 'expected.json'); + +if (!fs.existsSync(TMP_DIR)) fs.mkdirSync(TMP_DIR); + +if (!fs.existsSync(COMPUTED_PATH) || !fs.existsSync(EXPECTED_PATH)) { + throw new Error('Usage $0 '); +} + +try { + const computedResults = require(COMPUTED_PATH); + const expectedResults = require(EXPECTED_PATH); + + const sites = []; + for (const entry of computedResults.sites) { + const lanternValues = entry.lantern; + Object.keys(lanternValues).forEach(key => lanternValues[key] = Math.round(lanternValues[key])); + sites.push({url: entry.url, ...lanternValues}); + } + + fs.writeFileSync(TMP_COMPUTED, JSON.stringify({sites}, null, 2)); + fs.writeFileSync(TMP_EXPECTED, JSON.stringify(expectedResults, null, 2)); + + try { + execSync(`git --no-pager diff --color=always --no-index ${TMP_EXPECTED} ${TMP_COMPUTED}`); + console.log('✅ PASS No changes between expected and computed!'); + } catch (err) { + console.log('❌ FAIL Changes between expected and computed!\n'); + console.log(err.stdout.toString()); + } +} finally { + fs.unlinkSync(TMP_COMPUTED); + fs.unlinkSync(TMP_EXPECTED); +} diff --git a/lighthouse-core/scripts/lantern/download-traces.sh b/lighthouse-core/scripts/lantern/download-traces.sh index b252b6b3a37e..548b8a65fdb6 100755 --- a/lighthouse-core/scripts/lantern/download-traces.sh +++ b/lighthouse-core/scripts/lantern/download-traces.sh @@ -4,6 +4,11 @@ DIRNAME="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" LH_ROOT_PATH="$DIRNAME/../../.." cd $LH_ROOT_PATH +if [[ -f lantern-data/lantern-expectations.json ]] && ! [[ "$FORCE" ]]; then + echo "Lantern data already detected, done." + exit 0 +fi + # snapshot of ~100 traces with no throttling recorded 2017-12-06 on a HP z840 workstation TAR_URL="https://drive.google.com/a/chromium.org/uc?id=1_w2g6fQVLgHI62FApsyUDejZyHNXMLm0&export=download" curl -o lantern-traces.tar.gz -L $TAR_URL diff --git a/lighthouse-core/scripts/lantern/evaluate-results.js b/lighthouse-core/scripts/lantern/evaluate-results.js index 58e1f109be32..d214a1016d8a 100755 --- a/lighthouse-core/scripts/lantern/evaluate-results.js +++ b/lighthouse-core/scripts/lantern/evaluate-results.js @@ -8,6 +8,7 @@ /* eslint-disable no-console */ +const fs = require('fs'); const path = require('path'); const GOOD_ABSOLUTE_THRESHOLD = 0.2; @@ -15,9 +16,11 @@ const OK_ABSOLUTE_THRESHOLD = 0.5; const GOOD_RANK_THRESHOLD = 0.1; -if (!process.argv[2]) throw new Error('Usage $0 '); +const COMPUTATIONS_INPUT_ARG = process.argv[2] || './lantern-data/lantern-computed.json'; +const COMPUTATIONS_PATH = path.resolve(process.cwd(), COMPUTATIONS_INPUT_ARG); + +if (!fs.existsSync(COMPUTATIONS_PATH)) throw new Error('Usage $0 '); -const COMPUTATIONS_PATH = path.resolve(process.cwd(), process.argv[2]); /** @type {{sites: LanternSiteDefinition[]}} */ const expectations = require(COMPUTATIONS_PATH); diff --git a/lighthouse-core/scripts/lantern/run-all-expectations.js b/lighthouse-core/scripts/lantern/run-all-expectations.js index 8a09df54faa7..9b79b1b515a1 100755 --- a/lighthouse-core/scripts/lantern/run-all-expectations.js +++ b/lighthouse-core/scripts/lantern/run-all-expectations.js @@ -12,11 +12,13 @@ const fs = require('fs'); const path = require('path'); const execFileSync = require('child_process').execFileSync; -if (!process.argv[2]) throw new Error('Usage $0 '); - -const RUN_ONCE_PATH = path.join(__dirname, 'run-once.js'); -const EXPECTATIONS_PATH = path.resolve(process.cwd(), process.argv[2]); +const EXPECTATIONS_INPUT_ARG = process.argv[2] || './lantern-data/lantern-expectations.json'; +const EXPECTATIONS_PATH = path.resolve(process.cwd(), EXPECTATIONS_INPUT_ARG); const EXPECTATIONS_DIR = path.dirname(EXPECTATIONS_PATH); +const RUN_ONCE_PATH = path.join(__dirname, 'run-once.js'); + +if (!fs.existsSync(EXPECTATIONS_PATH)) throw new Error('Usage $0 '); + const expectations = require(EXPECTATIONS_PATH); for (const site of expectations.sites) { diff --git a/lighthouse-core/scripts/lantern/update-expectations.js b/lighthouse-core/scripts/lantern/update-expectations.js new file mode 100755 index 000000000000..4143af4b2440 --- /dev/null +++ b/lighthouse-core/scripts/lantern/update-expectations.js @@ -0,0 +1,44 @@ +#!/usr/bin/env node +/** + * @license Copyright 2018 Google Inc. 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. + */ +'use strict'; + +/* eslint-disable no-console */ + +const fs = require('fs'); +const path = require('path'); +const execFileSync = require('child_process').execFileSync; +const prettyJSONStringify = require('pretty-json-stringify'); + +const INPUT_PATH = process.argv[2] || './lantern-data/lantern-expectations.json'; +const EXPECTATIONS_PATH = path.resolve(process.cwd(), INPUT_PATH); +const EXPECTATIONS_DIR = path.dirname(EXPECTATIONS_PATH); +const COMPUTED_PATH = path.join(EXPECTATIONS_DIR, 'lantern-computed.json'); +const RUN_ALL_SCRIPT_PATH = path.join(__dirname, 'run-all-expectations.js'); +const OUTPUT_PATH = path.join(__dirname, '../../test/fixtures/lantern-expectations.json'); + +if (!fs.existsSync(COMPUTED_PATH) || process.env.FORCE) { + if (!fs.existsSync(EXPECTATIONS_PATH)) throw new Error('Usage $0 '); + execFileSync(RUN_ALL_SCRIPT_PATH, [EXPECTATIONS_PATH]); +} + +const computedResults = require(COMPUTED_PATH); + +const sites = []; +for (const entry of computedResults.sites) { + const lanternValues = entry.lantern; + Object.keys(lanternValues).forEach(key => lanternValues[key] = Math.round(lanternValues[key])); + sites.push({url: entry.url, ...lanternValues}); +} + +fs.writeFileSync(OUTPUT_PATH, prettyJSONStringify({sites}, { + tab: ' ', + spaceBeforeColon: '', + spaceInsideObject: '', + shouldExpand: (_, level) => level < 2, +})); + + diff --git a/lighthouse-core/scripts/test-lantern.sh b/lighthouse-core/scripts/test-lantern.sh new file mode 100755 index 000000000000..41757dfc1129 --- /dev/null +++ b/lighthouse-core/scripts/test-lantern.sh @@ -0,0 +1,34 @@ +#!/usr/bin/env bash + +DIRNAME="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +LH_ROOT="$DIRNAME/../.." +cd $LH_ROOT + +set -e + +# Testing lantern can be expensive, we'll only run the tests if we touched files that affect the simulations. +CHANGED_FILES="" +if [[ "$CI" ]]; then + CHANGED_FILES=$(git --no-pager diff --name-only $TRAVIS_COMMIT_RANGE) +else + CHANGED_FILES=$(git --no-pager diff --name-only master) +fi + +printf "Determined the following files have been touched:\n\n$CHANGED_FILES\n\n" + +if ! echo $CHANGED_FILES | grep -E 'dependency-graph|metrics|lantern' > /dev/null; then + echo "No lantern files affected, skipping lantern checks." + exit 0 +fi + +printf "Lantern files affected!\n\nDownloading test set...\n" +"$LH_ROOT/lighthouse-core/scripts/lantern/download-traces.sh" + +printf "\n\nRunning all expectations...\n" +"$LH_ROOT/lighthouse-core/scripts/lantern/run-all-expectations.js" + +printf "\n\n" +"$LH_ROOT/lighthouse-core/scripts/lantern/evaluate-results.js" + +printf "\n\nComparing to golden expectations...\n" +"$LH_ROOT/lighthouse-core/scripts/lantern/diff-expectations.js" diff --git a/lighthouse-core/test/fixtures/lantern-expectations.json b/lighthouse-core/test/fixtures/lantern-expectations.json new file mode 100644 index 000000000000..09e2c7794857 --- /dev/null +++ b/lighthouse-core/test/fixtures/lantern-expectations.json @@ -0,0 +1,103 @@ +{ + "sites": [ + {"url": "https://flipkart.com", "roughEstimateOfFCP": 2819, "optimisticFCP": 2017, "pessimisticFCP": 2017, "roughEstimateOfFMP": 6108, "optimisticFMP": 4960, "pessimisticFMP": 4960, "roughEstimateOfTTI": 12534, "optimisticTTI": 9513, "pessimisticTTI": 11613, "roughEstimateOfTTFCPUI": 12534, "optimisticTTFCPUI": 9513, "pessimisticTTFCPUI": 11613, "roughEstimateOfSI": 6223, "optimisticSI": 3687, "pessimisticSI": 2017, "roughEstimateOfEIL": 766, "optimisticEIL": 957, "pessimisticEIL": 957}, + {"url": "https://vine.co/", "roughEstimateOfFCP": 1977, "optimisticFCP": 1251, "pessimisticFCP": 1251, "roughEstimateOfFMP": 3204, "optimisticFMP": 1251, "pessimisticFMP": 2901, "roughEstimateOfTTI": 8901, "optimisticTTI": 6372, "pessimisticTTI": 7727, "roughEstimateOfTTFCPUI": 8901, "optimisticTTFCPUI": 6372, "pessimisticTTFCPUI": 7727, "roughEstimateOfSI": 3707, "optimisticSI": 2246, "pessimisticSI": 1251, "roughEstimateOfEIL": 961, "optimisticEIL": 1202, "pessimisticEIL": 1202}, + {"url": "https://weather.com/", "roughEstimateOfFCP": 5617, "optimisticFCP": 4561, "pessimisticFCP": 4561, "roughEstimateOfFMP": 5689, "optimisticFMP": 4561, "pessimisticFMP": 4561, "roughEstimateOfTTI": 25715, "optimisticTTI": 20554, "pessimisticTTI": 26182, "roughEstimateOfTTFCPUI": 25715, "optimisticTTFCPUI": 20554, "pessimisticTTFCPUI": 26182, "roughEstimateOfSI": 6301, "optimisticSI": 2561, "pessimisticSI": 4561, "roughEstimateOfEIL": 1648, "optimisticEIL": 2060, "pessimisticEIL": 2060}, + {"url": "http://www.4399.com/", "roughEstimateOfFCP": 3554, "optimisticFCP": 2685, "pessimisticFCP": 2685, "roughEstimateOfFMP": 3719, "optimisticFMP": 2685, "pessimisticFMP": 2685, "roughEstimateOfTTI": 5551, "optimisticTTI": 2696, "pessimisticTTI": 5185, "roughEstimateOfTTFCPUI": 5551, "optimisticTTFCPUI": 2696, "pessimisticTTFCPUI": 5185, "roughEstimateOfSI": 3554, "optimisticSI": 350, "pessimisticSI": 2685, "roughEstimateOfEIL": 13, "optimisticEIL": 16, "pessimisticEIL": 16}, + {"url": "http://www.4shared.com/", "roughEstimateOfFCP": 4380, "optimisticFCP": 3437, "pessimisticFCP": 3437, "roughEstimateOfFMP": 4509, "optimisticFMP": 3437, "pessimisticFMP": 3437, "roughEstimateOfTTI": 6302, "optimisticTTI": 4192, "pessimisticTTI": 4860, "roughEstimateOfTTFCPUI": 6302, "optimisticTTFCPUI": 4192, "pessimisticTTFCPUI": 4860, "roughEstimateOfSI": 4380, "optimisticSI": 1467, "pessimisticSI": 3437, "roughEstimateOfEIL": 51, "optimisticEIL": 63, "pessimisticEIL": 63}, + {"url": "http://www.56.com/", "roughEstimateOfFCP": 3727, "optimisticFCP": 2843, "pessimisticFCP": 2843, "roughEstimateOfFMP": 3885, "optimisticFMP": 2843, "pessimisticFMP": 2843, "roughEstimateOfTTI": 10645, "optimisticTTI": 3348, "pessimisticTTI": 15637, "roughEstimateOfTTFCPUI": 4476, "optimisticTTFCPUI": 3348, "pessimisticTTFCPUI": 1926, "roughEstimateOfSI": 9882, "optimisticSI": 5917, "pessimisticSI": 2843, "roughEstimateOfEIL": 13, "optimisticEIL": 16, "pessimisticEIL": 16}, + {"url": "http://www.58.com/", "roughEstimateOfFCP": 3549, "optimisticFCP": 2681, "pessimisticFCP": 2681, "roughEstimateOfFMP": 3715, "optimisticFMP": 2681, "pessimisticFMP": 2681, "roughEstimateOfTTI": 5599, "optimisticTTI": 3498, "pessimisticTTI": 4224, "roughEstimateOfTTFCPUI": 5599, "optimisticTTFCPUI": 3498, "pessimisticTTFCPUI": 4224, "roughEstimateOfSI": 6875, "optimisticSI": 3844, "pessimisticSI": 2681, "roughEstimateOfEIL": 1356, "optimisticEIL": 1695, "pessimisticEIL": 1695}, + {"url": "http://www.7k7k.com/", "roughEstimateOfFCP": 5546, "optimisticFCP": 4491, "pessimisticFCP": 4502, "roughEstimateOfFMP": 5622, "optimisticFMP": 4491, "pessimisticFMP": 4502, "roughEstimateOfTTI": 9935, "optimisticTTI": 5204, "pessimisticTTI": 11582, "roughEstimateOfTTFCPUI": 5622, "optimisticTTFCPUI": 5204, "pessimisticTTFCPUI": 1880, "roughEstimateOfSI": 9164, "optimisticSI": 4634, "pessimisticSI": 4502, "roughEstimateOfEIL": 1669, "optimisticEIL": 2086, "pessimisticEIL": 2086}, + {"url": "http://www.addthis.com/", "roughEstimateOfFCP": 3175, "optimisticFCP": 2341, "pessimisticFCP": 2341, "roughEstimateOfFMP": 3570, "optimisticFMP": 2543, "pessimisticFMP": 2543, "roughEstimateOfTTI": 10052, "optimisticTTI": 7175, "pessimisticTTI": 9216, "roughEstimateOfTTFCPUI": 10052, "optimisticTTFCPUI": 7175, "pessimisticTTFCPUI": 9216, "roughEstimateOfSI": 3405, "optimisticSI": 1524, "pessimisticSI": 2341, "roughEstimateOfEIL": 167, "optimisticEIL": 209, "pessimisticEIL": 209}, + {"url": "http://www.alexa.com/", "roughEstimateOfFCP": 7118, "optimisticFCP": 5925, "pessimisticFCP": 5925, "roughEstimateOfFMP": 7459, "optimisticFMP": 6247, "pessimisticFMP": 6247, "roughEstimateOfTTI": 15388, "optimisticTTI": 12076, "pessimisticTTI": 14540, "roughEstimateOfTTFCPUI": 15388, "optimisticTTFCPUI": 12076, "pessimisticTTFCPUI": 14540, "roughEstimateOfSI": 7118, "optimisticSI": 2192, "pessimisticSI": 5925, "roughEstimateOfEIL": 502, "optimisticEIL": 628, "pessimisticEIL": 628}, + {"url": "http://www.amazon.co.jp/", "roughEstimateOfFCP": 3305, "optimisticFCP": 2459, "pessimisticFCP": 2459, "roughEstimateOfFMP": 3607, "optimisticFMP": 2459, "pessimisticFMP": 2668, "roughEstimateOfTTI": 9030, "optimisticTTI": 5621, "pessimisticTTI": 9018, "roughEstimateOfTTFCPUI": 9030, "optimisticTTFCPUI": 5621, "pessimisticTTFCPUI": 9018, "roughEstimateOfSI": 4401, "optimisticSI": 2181, "pessimisticSI": 2459, "roughEstimateOfEIL": 262, "optimisticEIL": 328, "pessimisticEIL": 328}, + {"url": "http://www.att.com/", "roughEstimateOfFCP": 5409, "optimisticFCP": 3634, "pessimisticFCP": 5258, "roughEstimateOfFMP": 7094, "optimisticFMP": 4418, "pessimisticFMP": 7011, "roughEstimateOfTTI": 32310, "optimisticTTI": 26030, "pessimisticTTI": 33538, "roughEstimateOfTTFCPUI": 23710, "optimisticTTFCPUI": 26030, "pessimisticTTFCPUI": 14426, "roughEstimateOfSI": 15781, "optimisticSI": 9009, "pessimisticSI": 5258, "roughEstimateOfEIL": 1542, "optimisticEIL": 1928, "pessimisticEIL": 1928}, + {"url": "http://www.bing.com/", "roughEstimateOfFCP": 769, "optimisticFCP": 452, "pessimisticFCP": 452, "roughEstimateOfFMP": 1539, "optimisticFMP": 603, "pessimisticFMP": 1207, "roughEstimateOfTTI": 7574, "optimisticTTI": 3879, "pessimisticTTI": 8104, "roughEstimateOfTTFCPUI": 7574, "optimisticTTFCPUI": 3879, "pessimisticTTFCPUI": 8104, "roughEstimateOfSI": 2020, "optimisticSI": 1412, "pessimisticSI": 452, "roughEstimateOfEIL": 558, "optimisticEIL": 698, "pessimisticEIL": 698}, + {"url": "http://www.blogspot.com/", "roughEstimateOfFCP": 2815, "optimisticFCP": 2013, "pessimisticFCP": 2013, "roughEstimateOfFMP": 3014, "optimisticFMP": 2013, "pessimisticFMP": 2013, "roughEstimateOfTTI": 4407, "optimisticTTI": 2594, "pessimisticTTI": 2780, "roughEstimateOfTTFCPUI": 4407, "optimisticTTFCPUI": 2594, "pessimisticTTFCPUI": 2780, "roughEstimateOfSI": 11239, "optimisticSI": 7272, "pessimisticSI": 2013, "roughEstimateOfEIL": 13, "optimisticEIL": 16, "pessimisticEIL": 16}, + {"url": "http://www.brothersoft.com/", "roughEstimateOfFCP": 2481, "optimisticFCP": 1710, "pessimisticFCP": 1710, "roughEstimateOfFMP": 3365, "optimisticFMP": 2208, "pessimisticFMP": 2452, "roughEstimateOfTTI": 16936, "optimisticTTI": 12900, "pessimisticTTI": 16881, "roughEstimateOfTTFCPUI": 16936, "optimisticTTFCPUI": 12900, "pessimisticTTFCPUI": 16881, "roughEstimateOfSI": 4084, "optimisticSI": 2302, "pessimisticSI": 1710, "roughEstimateOfEIL": 636, "optimisticEIL": 795, "pessimisticEIL": 795}, + {"url": "http://www.china.com.cn/", "roughEstimateOfFCP": 5034, "optimisticFCP": 3589, "pessimisticFCP": 4562, "roughEstimateOfFMP": 5252, "optimisticFMP": 3589, "pessimisticFMP": 4562, "roughEstimateOfTTI": 7914, "optimisticTTI": 4173, "pessimisticTTI": 8466, "roughEstimateOfTTFCPUI": 5252, "optimisticTTFCPUI": 4173, "pessimisticTTFCPUI": 2407, "roughEstimateOfSI": 8102, "optimisticSI": 3848, "pessimisticSI": 4562, "roughEstimateOfEIL": 20, "optimisticEIL": 25, "pessimisticEIL": 25}, + {"url": "http://www.cnet.com/", "roughEstimateOfFCP": 2393, "optimisticFCP": 1451, "pessimisticFCP": 1845, "roughEstimateOfFMP": 2929, "optimisticFMP": 1451, "pessimisticFMP": 2294, "roughEstimateOfTTI": 25155, "optimisticTTI": 18878, "pessimisticTTI": 27174, "roughEstimateOfTTFCPUI": 25155, "optimisticTTFCPUI": 18878, "pessimisticTTFCPUI": 27174, "roughEstimateOfSI": 4292, "optimisticSI": 2388, "pessimisticSI": 1845, "roughEstimateOfEIL": 1061, "optimisticEIL": 1326, "pessimisticEIL": 1326}, + {"url": "http://www.cntv.cn/", "roughEstimateOfFCP": 3567, "optimisticFCP": 2697, "pessimisticFCP": 2697, "roughEstimateOfFMP": 3732, "optimisticFMP": 2697, "pessimisticFMP": 2697, "roughEstimateOfTTI": 4567, "optimisticTTI": 2697, "pessimisticTTI": 2997, "roughEstimateOfTTFCPUI": 4567, "optimisticTTFCPUI": 2697, "pessimisticTTFCPUI": 2997, "roughEstimateOfSI": 3890, "optimisticSI": 1705, "pessimisticSI": 2697, "roughEstimateOfEIL": 13, "optimisticEIL": 16, "pessimisticEIL": 16}, + {"url": "http://www.conduit.com/", "roughEstimateOfFCP": 2258, "optimisticFCP": 1507, "pessimisticFCP": 1507, "roughEstimateOfFMP": 2483, "optimisticFMP": 1507, "pessimisticFMP": 1507, "roughEstimateOfTTI": 3884, "optimisticTTI": 1960, "pessimisticTTI": 2463, "roughEstimateOfTTFCPUI": 3884, "optimisticTTFCPUI": 1960, "pessimisticTTFCPUI": 2463, "roughEstimateOfSI": 2539, "optimisticSI": 1292, "pessimisticSI": 1507, "roughEstimateOfEIL": 20, "optimisticEIL": 25, "pessimisticEIL": 25}, + {"url": "http://www.craigslist.org/", "roughEstimateOfFCP": 3615, "optimisticFCP": 2634, "pessimisticFCP": 2869, "roughEstimateOfFMP": 5456, "optimisticFMP": 4201, "pessimisticFMP": 4443, "roughEstimateOfTTI": 6120, "optimisticTTI": 4201, "pessimisticTTI": 4443, "roughEstimateOfTTFCPUI": 6120, "optimisticTTFCPUI": 4201, "pessimisticTTFCPUI": 4443, "roughEstimateOfSI": 3615, "optimisticSI": 1334, "pessimisticSI": 2869, "roughEstimateOfEIL": 182, "optimisticEIL": 227, "pessimisticEIL": 227}, + {"url": "http://www.dawn.com/", "roughEstimateOfFCP": 3859, "optimisticFCP": 2695, "pessimisticFCP": 3283, "roughEstimateOfFMP": 4083, "optimisticFMP": 2695, "pessimisticFMP": 3283, "roughEstimateOfTTI": 16102, "optimisticTTI": 12156, "pessimisticTTI": 16019, "roughEstimateOfTTFCPUI": 16102, "optimisticTTFCPUI": 12156, "pessimisticTTFCPUI": 16019, "roughEstimateOfSI": 5025, "optimisticSI": 2243, "pessimisticSI": 3283, "roughEstimateOfEIL": 298, "optimisticEIL": 373, "pessimisticEIL": 373}, + {"url": "http://www.depositfiles.com/", "roughEstimateOfFCP": 8891, "optimisticFCP": 7537, "pessimisticFCP": 7537, "roughEstimateOfFMP": 8891, "optimisticFMP": 7537, "pessimisticFMP": 7537, "roughEstimateOfTTI": 10999, "optimisticTTI": 8951, "pessimisticTTI": 8951, "roughEstimateOfTTFCPUI": 8891, "optimisticTTFCPUI": 775, "pessimisticTTFCPUI": 8951, "roughEstimateOfSI": 12654, "optimisticSI": 5718, "pessimisticSI": 7537, "roughEstimateOfEIL": 273, "optimisticEIL": 341, "pessimisticEIL": 341}, + {"url": "http://www.deviantart.com/", "roughEstimateOfFCP": 4693, "optimisticFCP": 3721, "pessimisticFCP": 3721, "roughEstimateOfFMP": 6268, "optimisticFMP": 5112, "pessimisticFMP": 5112, "roughEstimateOfTTI": 32184, "optimisticTTI": 18527, "pessimisticTTI": 43261, "roughEstimateOfTTFCPUI": 17915, "optimisticTTFCPUI": 18527, "pessimisticTTFCPUI": 11553, "roughEstimateOfSI": 5681, "optimisticSI": 2509, "pessimisticSI": 3721, "roughEstimateOfEIL": 624, "optimisticEIL": 780, "pessimisticEIL": 780}, + {"url": "http://www.dion.ne.jp/", "roughEstimateOfFCP": 8474, "optimisticFCP": 4680, "pessimisticFCP": 10133, "roughEstimateOfFMP": 9086, "optimisticFMP": 4680, "pessimisticFMP": 10133, "roughEstimateOfTTI": 34706, "optimisticTTI": 14284, "pessimisticTTI": 54524, "roughEstimateOfTTFCPUI": 20617, "optimisticTTFCPUI": 14284, "pessimisticTTFCPUI": 23214, "roughEstimateOfSI": 17627, "optimisticSI": 8065, "pessimisticSI": 10133, "roughEstimateOfEIL": 1028, "optimisticEIL": 1285, "pessimisticEIL": 1285}, + {"url": "http://www.domaintools.com/", "roughEstimateOfFCP": 1837, "optimisticFCP": 1125, "pessimisticFCP": 1125, "roughEstimateOfFMP": 3227, "optimisticFMP": 1995, "pessimisticFMP": 2383, "roughEstimateOfTTI": 9578, "optimisticTTI": 7177, "pessimisticTTI": 8159, "roughEstimateOfTTFCPUI": 9578, "optimisticTTFCPUI": 7177, "pessimisticTTFCPUI": 8159, "roughEstimateOfSI": 9196, "optimisticSI": 6225, "pessimisticSI": 1125, "roughEstimateOfEIL": 1346, "optimisticEIL": 1682, "pessimisticEIL": 1682}, + {"url": "http://www.douban.com/", "roughEstimateOfFCP": 7125, "optimisticFCP": 5932, "pessimisticFCP": 5932, "roughEstimateOfFMP": 7129, "optimisticFMP": 5932, "pessimisticFMP": 5932, "roughEstimateOfTTI": 9324, "optimisticTTI": 7076, "pessimisticTTI": 7729, "roughEstimateOfTTFCPUI": 9324, "optimisticTTFCPUI": 7076, "pessimisticTTFCPUI": 7729, "roughEstimateOfSI": 9975, "optimisticSI": 4549, "pessimisticSI": 5932, "roughEstimateOfEIL": 558, "optimisticEIL": 697, "pessimisticEIL": 697}, + {"url": "http://www.ebay.com/", "roughEstimateOfFCP": 2893, "optimisticFCP": 2085, "pessimisticFCP": 2085, "roughEstimateOfFMP": 3089, "optimisticFMP": 2085, "pessimisticFMP": 2085, "roughEstimateOfTTI": 8923, "optimisticTTI": 6143, "pessimisticTTI": 8083, "roughEstimateOfTTFCPUI": 8923, "optimisticTTFCPUI": 6143, "pessimisticTTFCPUI": 8083, "roughEstimateOfSI": 3728, "optimisticSI": 1873, "pessimisticSI": 2085, "roughEstimateOfEIL": 187, "optimisticEIL": 233, "pessimisticEIL": 233}, + {"url": "https://www.ebs.in/IPS/", "roughEstimateOfFCP": 6659, "optimisticFCP": 3785, "pessimisticFCP": 7576, "roughEstimateOfFMP": 7545, "optimisticFMP": 4161, "pessimisticFMP": 7955, "roughEstimateOfTTI": 21766, "optimisticTTI": 6860, "pessimisticTTI": 35667, "roughEstimateOfTTFCPUI": 7561, "optimisticTTFCPUI": 6860, "pessimisticTTFCPUI": 4100, "roughEstimateOfSI": 10123, "optimisticSI": 3892, "pessimisticSI": 7576, "roughEstimateOfEIL": 298, "optimisticEIL": 373, "pessimisticEIL": 373}, + {"url": "http://www.espn.com/", "roughEstimateOfFCP": 2917, "optimisticFCP": 2106, "pessimisticFCP": 2106, "roughEstimateOfFMP": 4068, "optimisticFMP": 2106, "pessimisticFMP": 3700, "roughEstimateOfTTI": 24187, "optimisticTTI": 19439, "pessimisticTTI": 24275, "roughEstimateOfTTFCPUI": 23459, "optimisticTTFCPUI": 19439, "pessimisticTTFCPUI": 22656, "roughEstimateOfSI": 3785, "optimisticSI": 1904, "pessimisticSI": 2106, "roughEstimateOfEIL": 1316, "optimisticEIL": 1645, "pessimisticEIL": 1645}, + {"url": "http://www.facebook.com/", "roughEstimateOfFCP": 3443, "optimisticFCP": 2585, "pessimisticFCP": 2585, "roughEstimateOfFMP": 3614, "optimisticFMP": 2585, "pessimisticFMP": 2585, "roughEstimateOfTTI": 5666, "optimisticTTI": 3421, "pessimisticTTI": 4474, "roughEstimateOfTTFCPUI": 5666, "optimisticTTFCPUI": 3421, "pessimisticTTFCPUI": 4474, "roughEstimateOfSI": 3669, "optimisticSI": 1599, "pessimisticSI": 2585, "roughEstimateOfEIL": 65, "optimisticEIL": 82, "pessimisticEIL": 82}, + {"url": "http://www.fc2.com/", "roughEstimateOfFCP": 3066, "optimisticFCP": 2242, "pessimisticFCP": 2242, "roughEstimateOfFMP": 3254, "optimisticFMP": 2242, "pessimisticFMP": 2242, "roughEstimateOfTTI": 4251, "optimisticTTI": 2440, "pessimisticTTI": 2638, "roughEstimateOfTTFCPUI": 4251, "optimisticTTFCPUI": 2440, "pessimisticTTFCPUI": 2638, "roughEstimateOfSI": 3231, "optimisticSI": 1446, "pessimisticSI": 2242, "roughEstimateOfEIL": 13, "optimisticEIL": 16, "pessimisticEIL": 16}, + {"url": "http://www.filestube.com/", "roughEstimateOfFCP": 9184, "optimisticFCP": 7803, "pessimisticFCP": 7803, "roughEstimateOfFMP": 11107, "optimisticFMP": 9264, "pessimisticFMP": 10063, "roughEstimateOfTTI": 25406, "optimisticTTI": 16639, "pessimisticTTI": 30716, "roughEstimateOfTTFCPUI": 18010, "optimisticTTFCPUI": 16639, "pessimisticTTFCPUI": 14282, "roughEstimateOfSI": 11939, "optimisticSI": 5083, "pessimisticSI": 7803, "roughEstimateOfEIL": 1198, "optimisticEIL": 1497, "pessimisticEIL": 1497}, + {"url": "http://www.foxnews.com/", "roughEstimateOfFCP": 3447, "optimisticFCP": 2588, "pessimisticFCP": 2588, "roughEstimateOfFMP": 3617, "optimisticFMP": 2588, "pessimisticFMP": 2588, "roughEstimateOfTTI": 30132, "optimisticTTI": 20217, "pessimisticTTI": 36447, "roughEstimateOfTTFCPUI": 28467, "optimisticTTFCPUI": 20217, "pessimisticTTFCPUI": 32749, "roughEstimateOfSI": 11115, "optimisticSI": 6916, "pessimisticSI": 2588, "roughEstimateOfEIL": 1306, "optimisticEIL": 1632, "pessimisticEIL": 1632}, + {"url": "http://www.getpersonas.com/", "roughEstimateOfFCP": 4265, "optimisticFCP": 3321, "pessimisticFCP": 3344, "roughEstimateOfFMP": 6777, "optimisticFMP": 5597, "pessimisticFMP": 5597, "roughEstimateOfTTI": 12397, "optimisticTTI": 9001, "pessimisticTTI": 11991, "roughEstimateOfTTFCPUI": 12397, "optimisticTTFCPUI": 9001, "pessimisticTTFCPUI": 11991, "roughEstimateOfSI": 4265, "optimisticSI": 1509, "pessimisticSI": 3344, "roughEstimateOfEIL": 1510, "optimisticEIL": 1888, "pessimisticEIL": 1888}, + {"url": "http://www.globo.com/", "roughEstimateOfFCP": 3558, "optimisticFCP": 2689, "pessimisticFCP": 2689, "roughEstimateOfFMP": 4217, "optimisticFMP": 2957, "pessimisticFMP": 3310, "roughEstimateOfTTI": 20958, "optimisticTTI": 15884, "pessimisticTTI": 21839, "roughEstimateOfTTFCPUI": 20958, "optimisticTTFCPUI": 15884, "pessimisticTTFCPUI": 21839, "roughEstimateOfSI": 4469, "optimisticSI": 2122, "pessimisticSI": 2689, "roughEstimateOfEIL": 2070, "optimisticEIL": 2588, "pessimisticEIL": 2588}, + {"url": "http://www.gmx.net/", "roughEstimateOfFCP": 2291, "optimisticFCP": 1537, "pessimisticFCP": 1537, "roughEstimateOfFMP": 2514, "optimisticFMP": 1537, "pessimisticFMP": 1537, "roughEstimateOfTTI": 9616, "optimisticTTI": 6627, "pessimisticTTI": 8978, "roughEstimateOfTTFCPUI": 9616, "optimisticTTFCPUI": 6627, "pessimisticTTFCPUI": 8978, "roughEstimateOfSI": 4970, "optimisticSI": 3015, "pessimisticSI": 1537, "roughEstimateOfEIL": 453, "optimisticEIL": 566, "pessimisticEIL": 566}, + {"url": "http://www.hatena.ne.jp/", "roughEstimateOfFCP": 1853, "optimisticFCP": 1025, "pessimisticFCP": 1276, "roughEstimateOfFMP": 2200, "optimisticFMP": 1188, "pessimisticFMP": 1276, "roughEstimateOfTTI": 22065, "optimisticTTI": 10950, "pessimisticTTI": 30878, "roughEstimateOfTTFCPUI": 14902, "optimisticTTFCPUI": 10950, "pessimisticTTFCPUI": 14960, "roughEstimateOfSI": 4530, "optimisticSI": 2821, "pessimisticSI": 1276, "roughEstimateOfEIL": 194, "optimisticEIL": 242, "pessimisticEIL": 242}, + {"url": "http://www.hexun.com/", "roughEstimateOfFCP": 4206, "optimisticFCP": 3278, "pessimisticFCP": 3278, "roughEstimateOfFMP": 5261, "optimisticFMP": 3278, "pessimisticFMP": 4809, "roughEstimateOfTTI": 8895, "optimisticTTI": 5514, "pessimisticTTI": 8858, "roughEstimateOfTTFCPUI": 8895, "optimisticTTFCPUI": 5514, "pessimisticTTFCPUI": 8858, "roughEstimateOfSI": 12760, "optimisticSI": 7771, "pessimisticSI": 3278, "roughEstimateOfEIL": 64, "optimisticEIL": 71, "pessimisticEIL": 88}, + {"url": "http://www.hotfile.com/", "roughEstimateOfFCP": 4943, "optimisticFCP": 3376, "pessimisticFCP": 4634, "roughEstimateOfFMP": 5200, "optimisticFMP": 3376, "pessimisticFMP": 4634, "roughEstimateOfTTI": 9928, "optimisticTTI": 5310, "pessimisticTTI": 11426, "roughEstimateOfTTFCPUI": 9928, "optimisticTTFCPUI": 5310, "pessimisticTTFCPUI": 11426, "roughEstimateOfSI": 9493, "optimisticSI": 4807, "pessimisticSI": 4634, "roughEstimateOfEIL": 100, "optimisticEIL": 126, "pessimisticEIL": 125}, + {"url": "http://www.hp.com/", "roughEstimateOfFCP": 8474, "optimisticFCP": 5962, "pessimisticFCP": 8594, "roughEstimateOfFMP": 9882, "optimisticFMP": 7293, "pessimisticFMP": 9499, "roughEstimateOfTTI": 17501, "optimisticTTI": 13912, "pessimisticTTI": 16785, "roughEstimateOfTTFCPUI": 17501, "optimisticTTFCPUI": 13912, "pessimisticTTFCPUI": 16785, "roughEstimateOfSI": 8693, "optimisticSI": 2398, "pessimisticSI": 8594, "roughEstimateOfEIL": 414, "optimisticEIL": 517, "pessimisticEIL": 517}, + {"url": "http://www.huffingtonpost.com/", "roughEstimateOfFCP": 3291, "optimisticFCP": 2446, "pessimisticFCP": 2446, "roughEstimateOfFMP": 3468, "optimisticFMP": 2446, "pessimisticFMP": 2446, "roughEstimateOfTTI": 20378, "optimisticTTI": 15398, "pessimisticTTI": 21198, "roughEstimateOfTTFCPUI": 20378, "optimisticTTFCPUI": 15398, "pessimisticTTFCPUI": 21198, "roughEstimateOfSI": 4104, "optimisticSI": 1974, "pessimisticSI": 2446, "roughEstimateOfEIL": 373, "optimisticEIL": 466, "pessimisticEIL": 466}, + {"url": "http://www.hulu.com/", "roughEstimateOfFCP": 13069, "optimisticFCP": 9026, "pessimisticFCP": 14108, "roughEstimateOfFMP": 15811, "optimisticFMP": 9805, "pessimisticFMP": 17498, "roughEstimateOfTTI": 25034, "optimisticTTI": 19714, "pessimisticTTI": 25790, "roughEstimateOfTTFCPUI": 25034, "optimisticTTFCPUI": 19714, "pessimisticTTFCPUI": 25790, "roughEstimateOfSI": 14682, "optimisticSI": 4115, "pessimisticSI": 14108, "roughEstimateOfEIL": 1468, "optimisticEIL": 1835, "pessimisticEIL": 1835}, + {"url": "http://www.iciba.com/", "roughEstimateOfFCP": 1436, "optimisticFCP": 845, "pessimisticFCP": 845, "roughEstimateOfFMP": 1647, "optimisticFMP": 845, "pessimisticFMP": 845, "roughEstimateOfTTI": 4294, "optimisticTTI": 2130, "pessimisticTTI": 3146, "roughEstimateOfTTFCPUI": 4294, "optimisticTTFCPUI": 2130, "pessimisticTTFCPUI": 3146, "roughEstimateOfSI": 4622, "optimisticSI": 3088, "pessimisticSI": 845, "roughEstimateOfEIL": 394, "optimisticEIL": 492, "pessimisticEIL": 492}, + {"url": "http://www.ifeng.com/", "roughEstimateOfFCP": 3827, "optimisticFCP": 2934, "pessimisticFCP": 2934, "roughEstimateOfFMP": 3980, "optimisticFMP": 2934, "pessimisticFMP": 2934, "roughEstimateOfTTI": 6299, "optimisticTTI": 2934, "pessimisticTTI": 6530, "roughEstimateOfTTFCPUI": 6275, "optimisticTTFCPUI": 2894, "pessimisticTTFCPUI": 6530, "roughEstimateOfSI": 3827, "optimisticSI": 879, "pessimisticSI": 2934, "roughEstimateOfEIL": 13, "optimisticEIL": 16, "pessimisticEIL": 16}, + {"url": "http://www.imageshack.us/", "roughEstimateOfFCP": 7728, "optimisticFCP": 6409, "pessimisticFCP": 6565, "roughEstimateOfFMP": 7728, "optimisticFMP": 6409, "pessimisticFMP": 6565, "roughEstimateOfTTI": 10364, "optimisticTTI": 8218, "pessimisticTTI": 8520, "roughEstimateOfTTFCPUI": 10364, "optimisticTTFCPUI": 8218, "pessimisticTTFCPUI": 8520, "roughEstimateOfSI": 7728, "optimisticSI": 1817, "pessimisticSI": 6565, "roughEstimateOfEIL": 1491, "optimisticEIL": 1864, "pessimisticEIL": 1864}, + {"url": "http://www.irs.gov/", "roughEstimateOfFCP": 3303, "optimisticFCP": 2457, "pessimisticFCP": 2457, "roughEstimateOfFMP": 4559, "optimisticFMP": 3257, "pessimisticFMP": 3656, "roughEstimateOfTTI": 13260, "optimisticTTI": 9497, "pessimisticTTI": 13248, "roughEstimateOfTTFCPUI": 13260, "optimisticTTFCPUI": 9497, "pessimisticTTFCPUI": 13248, "roughEstimateOfSI": 3364, "optimisticSI": 1440, "pessimisticSI": 2457, "roughEstimateOfEIL": 225, "optimisticEIL": 281, "pessimisticEIL": 281}, + {"url": "http://www.java.com/", "roughEstimateOfFCP": 1646, "optimisticFCP": 968, "pessimisticFCP": 968, "roughEstimateOfFMP": 1888, "optimisticFMP": 968, "pessimisticFMP": 968, "roughEstimateOfTTI": 4262, "optimisticTTI": 2210, "pessimisticTTI": 2968, "roughEstimateOfTTFCPUI": 4262, "optimisticTTFCPUI": 2210, "pessimisticTTFCPUI": 2968, "roughEstimateOfSI": 2177, "optimisticSI": 1284, "pessimisticSI": 968, "roughEstimateOfEIL": 13, "optimisticEIL": 16, "pessimisticEIL": 16}, + {"url": "http://www.linkedin.com/", "roughEstimateOfFCP": 5024, "optimisticFCP": 4021, "pessimisticFCP": 4021, "roughEstimateOfFMP": 5123, "optimisticFMP": 4021, "pessimisticFMP": 4021, "roughEstimateOfTTI": 6240, "optimisticTTI": 4323, "pessimisticTTI": 4547, "roughEstimateOfTTFCPUI": 6240, "optimisticTTFCPUI": 4323, "pessimisticTTFCPUI": 4547, "roughEstimateOfSI": 5024, "optimisticSI": 1074, "pessimisticSI": 4021, "roughEstimateOfEIL": 1598, "optimisticEIL": 1998, "pessimisticEIL": 1998}, + {"url": "http://www.livedoor.jp/", "roughEstimateOfFCP": 3333, "optimisticFCP": 2484, "pessimisticFCP": 2484, "roughEstimateOfFMP": 3509, "optimisticFMP": 2484, "pessimisticFMP": 2484, "roughEstimateOfTTI": 16561, "optimisticTTI": 10406, "pessimisticTTI": 19372, "roughEstimateOfTTFCPUI": 14360, "optimisticTTFCPUI": 10406, "pessimisticTTFCPUI": 14480, "roughEstimateOfSI": 7328, "optimisticSI": 4260, "pessimisticSI": 2484, "roughEstimateOfEIL": 221, "optimisticEIL": 276, "pessimisticEIL": 276}, + {"url": "http://www.liveperson.net/", "roughEstimateOfFCP": 11748, "optimisticFCP": 10045, "pessimisticFCP": 10241, "roughEstimateOfFMP": 12183, "optimisticFMP": 10634, "pessimisticFMP": 10830, "roughEstimateOfTTI": 34702, "optimisticTTI": 18360, "pessimisticTTI": 49081, "roughEstimateOfTTFCPUI": 13195, "optimisticTTFCPUI": 8512, "pessimisticTTFCPUI": 14417, "roughEstimateOfSI": 11748, "optimisticSI": 2248, "pessimisticSI": 10241, "roughEstimateOfEIL": 354, "optimisticEIL": 442, "pessimisticEIL": 442}, + {"url": "http://www.mail.ru/", "roughEstimateOfFCP": 5275, "optimisticFCP": 4250, "pessimisticFCP": 4250, "roughEstimateOfFMP": 5363, "optimisticFMP": 4250, "pessimisticFMP": 4250, "roughEstimateOfTTI": 11830, "optimisticTTI": 8391, "pessimisticTTI": 11546, "roughEstimateOfTTFCPUI": 11830, "optimisticTTFCPUI": 8391, "pessimisticTTFCPUI": 11546, "roughEstimateOfSI": 7902, "optimisticSI": 3849, "pessimisticSI": 4250, "roughEstimateOfEIL": 48, "optimisticEIL": 60, "pessimisticEIL": 60}, + {"url": "http://www.maktoob.com/", "roughEstimateOfFCP": 3986, "optimisticFCP": 3078, "pessimisticFCP": 3078, "roughEstimateOfFMP": 4132, "optimisticFMP": 3078, "pessimisticFMP": 3078, "roughEstimateOfTTI": 12242, "optimisticTTI": 9682, "pessimisticTTI": 10739, "roughEstimateOfTTFCPUI": 12242, "optimisticTTFCPUI": 9682, "pessimisticTTFCPUI": 10739, "roughEstimateOfSI": 4716, "optimisticSI": 2118, "pessimisticSI": 3078, "roughEstimateOfEIL": 265, "optimisticEIL": 332, "pessimisticEIL": 332}, + {"url": "http://www.marketgid.com/", "roughEstimateOfFCP": 3848, "optimisticFCP": 2952, "pessimisticFCP": 2952, "roughEstimateOfFMP": 6657, "optimisticFMP": 5483, "pessimisticFMP": 5483, "roughEstimateOfTTI": 9770, "optimisticTTI": 7073, "pessimisticTTI": 8723, "roughEstimateOfTTFCPUI": 9770, "optimisticTTFCPUI": 7073, "pessimisticTTFCPUI": 8723, "roughEstimateOfSI": 4795, "optimisticSI": 2233, "pessimisticSI": 2952, "roughEstimateOfEIL": 226, "optimisticEIL": 283, "pessimisticEIL": 283}, + {"url": "http://www.metacafe.com/", "roughEstimateOfFCP": 1973, "optimisticFCP": 1248, "pessimisticFCP": 1248, "roughEstimateOfFMP": 2213, "optimisticFMP": 1250, "pessimisticFMP": 1250, "roughEstimateOfTTI": 16192, "optimisticTTI": 12260, "pessimisticTTI": 16080, "roughEstimateOfTTFCPUI": 16192, "optimisticTTFCPUI": 12260, "pessimisticTTFCPUI": 16080, "roughEstimateOfSI": 2512, "optimisticSI": 1393, "pessimisticSI": 1248, "roughEstimateOfEIL": 361, "optimisticEIL": 451, "pessimisticEIL": 451}, + {"url": "http://www.metrolyrics.com/", "roughEstimateOfFCP": 3401, "optimisticFCP": 2456, "pessimisticFCP": 2654, "roughEstimateOfFMP": 3598, "optimisticFMP": 2456, "pessimisticFMP": 2654, "roughEstimateOfTTI": 54608, "optimisticTTI": 38080, "pessimisticTTI": 67023, "roughEstimateOfTTFCPUI": 28570, "optimisticTTFCPUI": 38080, "pessimisticTTFCPUI": 9160, "roughEstimateOfSI": 14965, "optimisticSI": 9636, "pessimisticSI": 2654, "roughEstimateOfEIL": 1134, "optimisticEIL": 1417, "pessimisticEIL": 1417}, + {"url": "http://www.mlb.com/", "roughEstimateOfFCP": 3235, "optimisticFCP": 2124, "pessimisticFCP": 2722, "roughEstimateOfFMP": 3489, "optimisticFMP": 2124, "pessimisticFMP": 2722, "roughEstimateOfTTI": 31734, "optimisticTTI": 25537, "pessimisticTTI": 32914, "roughEstimateOfTTFCPUI": 20685, "optimisticTTFCPUI": 25537, "pessimisticTTFCPUI": 8361, "roughEstimateOfSI": 7242, "optimisticSI": 4088, "pessimisticSI": 2722, "roughEstimateOfEIL": 761, "optimisticEIL": 951, "pessimisticEIL": 951}, + {"url": "http://www.mop.com/", "roughEstimateOfFCP": 7496, "optimisticFCP": 5780, "pessimisticFCP": 6856, "roughEstimateOfFMP": 7614, "optimisticFMP": 5780, "pessimisticFMP": 6856, "roughEstimateOfTTI": 20885, "optimisticTTI": 9659, "pessimisticTTI": 29977, "roughEstimateOfTTFCPUI": 8565, "optimisticTTFCPUI": 9659, "pessimisticTTFCPUI": 2599, "roughEstimateOfSI": 9814, "optimisticSI": 4006, "pessimisticSI": 6856, "roughEstimateOfEIL": 828, "optimisticEIL": 1035, "pessimisticEIL": 1035}, + {"url": "http://www.mozilla.org/", "roughEstimateOfFCP": 2556, "optimisticFCP": 1455, "pessimisticFCP": 2166, "roughEstimateOfFMP": 3307, "optimisticFMP": 1455, "pessimisticFMP": 2919, "roughEstimateOfTTI": 6322, "optimisticTTI": 3850, "pessimisticTTI": 5361, "roughEstimateOfTTFCPUI": 6322, "optimisticTTFCPUI": 3850, "pessimisticTTFCPUI": 5361, "roughEstimateOfSI": 2798, "optimisticSI": 1172, "pessimisticSI": 2166, "roughEstimateOfEIL": 842, "optimisticEIL": 1053, "pessimisticEIL": 1053}, + {"url": "http://www.msn.com/", "roughEstimateOfFCP": 2651, "optimisticFCP": 1865, "pessimisticFCP": 1865, "roughEstimateOfFMP": 2976, "optimisticFMP": 1865, "pessimisticFMP": 2061, "roughEstimateOfTTI": 11598, "optimisticTTI": 8171, "pessimisticTTI": 11324, "roughEstimateOfTTFCPUI": 11598, "optimisticTTFCPUI": 8171, "pessimisticTTFCPUI": 11324, "roughEstimateOfSI": 3691, "optimisticSI": 1949, "pessimisticSI": 1865, "roughEstimateOfEIL": 313, "optimisticEIL": 391, "pessimisticEIL": 391}, + {"url": "http://www.netflix.com/", "roughEstimateOfFCP": 2695, "optimisticFCP": 1904, "pessimisticFCP": 1904, "roughEstimateOfFMP": 2899, "optimisticFMP": 1904, "pessimisticFMP": 1904, "roughEstimateOfTTI": 6407, "optimisticTTI": 4163, "pessimisticTTI": 5131, "roughEstimateOfTTFCPUI": 6407, "optimisticTTFCPUI": 4163, "pessimisticTTFCPUI": 5131, "roughEstimateOfSI": 2966, "optimisticSI": 1413, "pessimisticSI": 1904, "roughEstimateOfEIL": 393, "optimisticEIL": 491, "pessimisticEIL": 491}, + {"url": "http://www.nih.gov/", "roughEstimateOfFCP": 5054, "optimisticFCP": 3606, "pessimisticFCP": 4582, "roughEstimateOfFMP": 5272, "optimisticFMP": 3606, "pessimisticFMP": 4582, "roughEstimateOfTTI": 9227, "optimisticTTI": 5225, "pessimisticTTI": 9981, "roughEstimateOfTTFCPUI": 9227, "optimisticTTFCPUI": 5225, "pessimisticTTFCPUI": 9981, "roughEstimateOfSI": 6657, "optimisticSI": 2807, "pessimisticSI": 4582, "roughEstimateOfEIL": 106, "optimisticEIL": 116, "pessimisticEIL": 148}, + {"url": "http://www.ning.com/", "roughEstimateOfFCP": 2922, "optimisticFCP": 2111, "pessimisticFCP": 2111, "roughEstimateOfFMP": 3424, "optimisticFMP": 2404, "pessimisticFMP": 2404, "roughEstimateOfTTI": 15624, "optimisticTTI": 10628, "pessimisticTTI": 16995, "roughEstimateOfTTFCPUI": 15624, "optimisticTTFCPUI": 10628, "pessimisticTTFCPUI": 16995, "roughEstimateOfSI": 3403, "optimisticSI": 1629, "pessimisticSI": 2111, "roughEstimateOfEIL": 253, "optimisticEIL": 316, "pessimisticEIL": 316}, + {"url": "http://www.nokia.com/", "roughEstimateOfFCP": 6305, "optimisticFCP": 5186, "pessimisticFCP": 5186, "roughEstimateOfFMP": 6346, "optimisticFMP": 5186, "pessimisticFMP": 5186, "roughEstimateOfTTI": 14376, "optimisticTTI": 9886, "pessimisticTTI": 15209, "roughEstimateOfTTFCPUI": 14376, "optimisticTTFCPUI": 9886, "pessimisticTTFCPUI": 15209, "roughEstimateOfSI": 6305, "optimisticSI": 2069, "pessimisticSI": 5186, "roughEstimateOfEIL": 211, "optimisticEIL": 264, "pessimisticEIL": 264}, + {"url": "http://www.ocn.ne.jp/", "roughEstimateOfFCP": 3617, "optimisticFCP": 2743, "pessimisticFCP": 2743, "roughEstimateOfFMP": 3780, "optimisticFMP": 2743, "pessimisticFMP": 2743, "roughEstimateOfTTI": 9278, "optimisticTTI": 5906, "pessimisticTTI": 9186, "roughEstimateOfTTFCPUI": 9278, "optimisticTTFCPUI": 5906, "pessimisticTTFCPUI": 9186, "roughEstimateOfSI": 5506, "optimisticSI": 2838, "pessimisticSI": 2743, "roughEstimateOfEIL": 75, "optimisticEIL": 94, "pessimisticEIL": 94}, + {"url": "http://www.onet.pl/", "roughEstimateOfFCP": 4230, "optimisticFCP": 3162, "pessimisticFCP": 3465, "roughEstimateOfFMP": 5355, "optimisticFMP": 4070, "pessimisticFMP": 4373, "roughEstimateOfTTI": 20585, "optimisticTTI": 13386, "pessimisticTTI": 24342, "roughEstimateOfTTFCPUI": 15282, "optimisticTTFCPUI": 13386, "pessimisticTTFCPUI": 12556, "roughEstimateOfSI": 14603, "optimisticSI": 9001, "pessimisticSI": 3465, "roughEstimateOfEIL": 1150, "optimisticEIL": 1437, "pessimisticEIL": 1437}, + {"url": "http://www.optmd.com/", "roughEstimateOfFCP": 1227, "optimisticFCP": 660, "pessimisticFCP": 870, "roughEstimateOfFMP": 1413, "optimisticFMP": 660, "pessimisticFMP": 870, "roughEstimateOfTTI": 1874, "optimisticTTI": 674, "pessimisticTTI": 870, "roughEstimateOfTTFCPUI": 1806, "optimisticTTFCPUI": 674, "pessimisticTTFCPUI": 718, "roughEstimateOfSI": 1227, "optimisticSI": 542, "pessimisticSI": 870, "roughEstimateOfEIL": 13, "optimisticEIL": 16, "pessimisticEIL": 16}, + {"url": "http://www.orange.fr/", "roughEstimateOfFCP": 3677, "optimisticFCP": 2319, "pessimisticFCP": 3372, "roughEstimateOfFMP": 4143, "optimisticFMP": 2319, "pessimisticFMP": 3665, "roughEstimateOfTTI": 14786, "optimisticTTI": 10328, "pessimisticTTI": 15532, "roughEstimateOfTTFCPUI": 14786, "optimisticTTFCPUI": 10328, "pessimisticTTFCPUI": 15532, "roughEstimateOfSI": 8536, "optimisticSI": 4710, "pessimisticSI": 3372, "roughEstimateOfEIL": 433, "optimisticEIL": 541, "pessimisticEIL": 541}, + {"url": "http://www.orkut.com/", "roughEstimateOfFCP": 1875, "optimisticFCP": 1120, "pessimisticFCP": 1206, "roughEstimateOfFMP": 2128, "optimisticFMP": 1120, "pessimisticFMP": 1206, "roughEstimateOfTTI": 3108, "optimisticTTI": 1436, "pessimisticTTI": 1436, "roughEstimateOfTTFCPUI": 3108, "optimisticTTFCPUI": 1436, "pessimisticTTFCPUI": 1436, "roughEstimateOfSI": 1875, "optimisticSI": 873, "pessimisticSI": 1206, "roughEstimateOfEIL": 13, "optimisticEIL": 16, "pessimisticEIL": 16}, + {"url": "http://www.partypoker.com/", "roughEstimateOfFCP": 6448, "optimisticFCP": 5184, "pessimisticFCP": 5476, "roughEstimateOfFMP": 6518, "optimisticFMP": 5184, "pessimisticFMP": 5476, "roughEstimateOfTTI": 18808, "optimisticTTI": 12254, "pessimisticTTI": 21900, "roughEstimateOfTTFCPUI": 13899, "optimisticTTFCPUI": 12254, "pessimisticTTFCPUI": 10993, "roughEstimateOfSI": 10690, "optimisticSI": 5272, "pessimisticSI": 5476, "roughEstimateOfEIL": 217, "optimisticEIL": 293, "pessimisticEIL": 250}, + {"url": "http://www.pcpop.com/", "roughEstimateOfFCP": 2910, "optimisticFCP": 2008, "pessimisticFCP": 2210, "roughEstimateOfFMP": 3130, "optimisticFMP": 2008, "pessimisticFMP": 2210, "roughEstimateOfTTI": 8601, "optimisticTTI": 4392, "pessimisticTTI": 9701, "roughEstimateOfTTFCPUI": 8601, "optimisticTTFCPUI": 4392, "pessimisticTTFCPUI": 9701, "roughEstimateOfSI": 5446, "optimisticSI": 3042, "pessimisticSI": 2210, "roughEstimateOfEIL": 80, "optimisticEIL": 100, "pessimisticEIL": 100}, + {"url": "http://www.pdfqueen.com/", "roughEstimateOfFCP": 2735, "optimisticFCP": 1857, "pessimisticFCP": 2042, "roughEstimateOfFMP": 2961, "optimisticFMP": 1857, "pessimisticFMP": 2042, "roughEstimateOfTTI": 4873, "optimisticTTI": 3053, "pessimisticTTI": 3203, "roughEstimateOfTTFCPUI": 4873, "optimisticTTFCPUI": 3053, "pessimisticTTFCPUI": 3203, "roughEstimateOfSI": 2735, "optimisticSI": 816, "pessimisticSI": 2042, "roughEstimateOfEIL": 13, "optimisticEIL": 16, "pessimisticEIL": 16}, + {"url": "http://www.pptv.com/", "roughEstimateOfFCP": 2828, "optimisticFCP": 2025, "pessimisticFCP": 2025, "roughEstimateOfFMP": 3026, "optimisticFMP": 2025, "pessimisticFMP": 2025, "roughEstimateOfTTI": 10247, "optimisticTTI": 5951, "pessimisticTTI": 11281, "roughEstimateOfTTFCPUI": 6786, "optimisticTTFCPUI": 5951, "pessimisticTTFCPUI": 3590, "roughEstimateOfSI": 11215, "optimisticSI": 7249, "pessimisticSI": 2025, "roughEstimateOfEIL": 623, "optimisticEIL": 779, "pessimisticEIL": 779}, + {"url": "http://www.rakuten.co.jp/", "roughEstimateOfFCP": 4183, "optimisticFCP": 3257, "pessimisticFCP": 3257, "roughEstimateOfFMP": 4320, "optimisticFMP": 3257, "pessimisticFMP": 3257, "roughEstimateOfTTI": 24817, "optimisticTTI": 13328, "pessimisticTTI": 33822, "roughEstimateOfTTFCPUI": 13639, "optimisticTTFCPUI": 13328, "pessimisticTTFCPUI": 8981, "roughEstimateOfSI": 5392, "optimisticSI": 2518, "pessimisticSI": 3257, "roughEstimateOfEIL": 1283, "optimisticEIL": 1604, "pessimisticEIL": 1604}, + {"url": "http://www.rakuten.ne.jp/", "roughEstimateOfFCP": 2959, "optimisticFCP": 2086, "pessimisticFCP": 2213, "roughEstimateOfFMP": 3167, "optimisticFMP": 2086, "pessimisticFMP": 2213, "roughEstimateOfTTI": 24461, "optimisticTTI": 12581, "pessimisticTTI": 34027, "roughEstimateOfTTFCPUI": 12636, "optimisticTTFCPUI": 12581, "pessimisticTTFCPUI": 7749, "roughEstimateOfSI": 4343, "optimisticSI": 2253, "pessimisticSI": 2213, "roughEstimateOfEIL": 1719, "optimisticEIL": 2149, "pessimisticEIL": 2149}, + {"url": "http://www.scribd.com/", "roughEstimateOfFCP": 2824, "optimisticFCP": 2022, "pessimisticFCP": 2022, "roughEstimateOfFMP": 4270, "optimisticFMP": 3208, "pessimisticFMP": 3210, "roughEstimateOfTTI": 13782, "optimisticTTI": 10227, "pessimisticTTI": 13435, "roughEstimateOfTTFCPUI": 13782, "optimisticTTFCPUI": 10227, "pessimisticTTFCPUI": 13435, "roughEstimateOfSI": 3386, "optimisticSI": 1658, "pessimisticSI": 2022, "roughEstimateOfEIL": 833, "optimisticEIL": 1041, "pessimisticEIL": 1041}, + {"url": "http://www.shopping.com/", "roughEstimateOfFCP": 2126, "optimisticFCP": 1387, "pessimisticFCP": 1387, "roughEstimateOfFMP": 2357, "optimisticFMP": 1387, "pessimisticFMP": 1387, "roughEstimateOfTTI": 3356, "optimisticTTI": 1532, "pessimisticTTI": 1858, "roughEstimateOfTTFCPUI": 3356, "optimisticTTFCPUI": 1532, "pessimisticTTFCPUI": 1858, "roughEstimateOfSI": 2126, "optimisticSI": 902, "pessimisticSI": 1387, "roughEstimateOfEIL": 13, "optimisticEIL": 16, "pessimisticEIL": 16}, + {"url": "http://www.skype.com/", "roughEstimateOfFCP": 4738, "optimisticFCP": 3762, "pessimisticFCP": 3762, "roughEstimateOfFMP": 4850, "optimisticFMP": 3762, "pessimisticFMP": 3762, "roughEstimateOfTTI": 8469, "optimisticTTI": 5911, "pessimisticTTI": 7382, "roughEstimateOfTTFCPUI": 8469, "optimisticTTFCPUI": 5911, "pessimisticTTFCPUI": 7382, "roughEstimateOfSI": 5178, "optimisticSI": 2131, "pessimisticSI": 3762, "roughEstimateOfEIL": 111, "optimisticEIL": 139, "pessimisticEIL": 139}, + {"url": "http://www.so-net.ne.jp/", "roughEstimateOfFCP": 5131, "optimisticFCP": 3169, "pessimisticFCP": 5260, "roughEstimateOfFMP": 5482, "optimisticFMP": 3169, "pessimisticFMP": 5260, "roughEstimateOfTTI": 13060, "optimisticTTI": 9802, "pessimisticTTI": 12397, "roughEstimateOfTTFCPUI": 13060, "optimisticTTFCPUI": 9802, "pessimisticTTFCPUI": 12397, "roughEstimateOfSI": 8408, "optimisticSI": 3742, "pessimisticSI": 5260, "roughEstimateOfEIL": 1798, "optimisticEIL": 2248, "pessimisticEIL": 2248}, + {"url": "http://www.softonic.com/", "roughEstimateOfFCP": 4230, "optimisticFCP": 3300, "pessimisticFCP": 3300, "roughEstimateOfFMP": 4365, "optimisticFMP": 3300, "pessimisticFMP": 3300, "roughEstimateOfTTI": 19507, "optimisticTTI": 15223, "pessimisticTTI": 19496, "roughEstimateOfTTFCPUI": 19507, "optimisticTTFCPUI": 15223, "pessimisticTTFCPUI": 19496, "roughEstimateOfSI": 14189, "optimisticSI": 8782, "pessimisticSI": 3300, "roughEstimateOfEIL": 317, "optimisticEIL": 396, "pessimisticEIL": 396}, + {"url": "http://www.sogou.com/", "roughEstimateOfFCP": 3025, "optimisticFCP": 2204, "pessimisticFCP": 2204, "roughEstimateOfFMP": 3215, "optimisticFMP": 2204, "pessimisticFMP": 2204, "roughEstimateOfTTI": 6205, "optimisticTTI": 3522, "pessimisticTTI": 5538, "roughEstimateOfTTFCPUI": 6205, "optimisticTTFCPUI": 3522, "pessimisticTTFCPUI": 5538, "roughEstimateOfSI": 6341, "optimisticSI": 3684, "pessimisticSI": 2204, "roughEstimateOfEIL": 261, "optimisticEIL": 326, "pessimisticEIL": 326}, + {"url": "http://www.soso.com/", "roughEstimateOfFCP": 2360, "optimisticFCP": 1490, "pessimisticFCP": 1733, "roughEstimateOfFMP": 2610, "optimisticFMP": 1490, "pessimisticFMP": 1733, "roughEstimateOfTTI": 7252, "optimisticTTI": 3940, "pessimisticTTI": 7306, "roughEstimateOfTTFCPUI": 6382, "optimisticTTFCPUI": 3940, "pessimisticTTFCPUI": 5373, "roughEstimateOfSI": 4431, "optimisticSI": 2539, "pessimisticSI": 1733, "roughEstimateOfEIL": 434, "optimisticEIL": 543, "pessimisticEIL": 543}, + {"url": "http://www.symantec.com/", "roughEstimateOfFCP": 4911, "optimisticFCP": 3824, "pessimisticFCP": 4033, "roughEstimateOfFMP": 5041, "optimisticFMP": 3824, "pessimisticFMP": 4033, "roughEstimateOfTTI": 18178, "optimisticTTI": 13591, "pessimisticTTI": 18718, "roughEstimateOfTTFCPUI": 18178, "optimisticTTFCPUI": 13591, "pessimisticTTFCPUI": 18718, "roughEstimateOfSI": 7132, "optimisticSI": 3400, "pessimisticSI": 4033, "roughEstimateOfEIL": 2678, "optimisticEIL": 3348, "pessimisticEIL": 3348}, + {"url": "http://www.t-online.de/", "roughEstimateOfFCP": 4892, "optimisticFCP": 3765, "pessimisticFCP": 4065, "roughEstimateOfFMP": 5827, "optimisticFMP": 3765, "pessimisticFMP": 5388, "roughEstimateOfTTI": 25446, "optimisticTTI": 19453, "pessimisticTTI": 27054, "roughEstimateOfTTFCPUI": 25446, "optimisticTTFCPUI": 19453, "pessimisticTTFCPUI": 27054, "roughEstimateOfSI": 9068, "optimisticSI": 4768, "pessimisticSI": 4065, "roughEstimateOfEIL": 397, "optimisticEIL": 497, "pessimisticEIL": 497}, + {"url": "http://www.tabelog.com/", "roughEstimateOfFCP": 3670, "optimisticFCP": 2323, "pessimisticFCP": 3351, "roughEstimateOfFMP": 3956, "optimisticFMP": 2323, "pessimisticFMP": 3351, "roughEstimateOfTTI": 13369, "optimisticTTI": 8904, "pessimisticTTI": 14283, "roughEstimateOfTTFCPUI": 13369, "optimisticTTFCPUI": 8904, "pessimisticTTFCPUI": 14283, "roughEstimateOfSI": 10077, "optimisticSI": 5820, "pessimisticSI": 3351, "roughEstimateOfEIL": 912, "optimisticEIL": 522, "pessimisticEIL": 1758}, + {"url": "http://www.thefreedictionary.com/", "roughEstimateOfFCP": 1805, "optimisticFCP": 1096, "pessimisticFCP": 1096, "roughEstimateOfFMP": 2050, "optimisticFMP": 1096, "pessimisticFMP": 1096, "roughEstimateOfTTI": 22243, "optimisticTTI": 16021, "pessimisticTTI": 24512, "roughEstimateOfTTFCPUI": 22243, "optimisticTTFCPUI": 16021, "pessimisticTTFCPUI": 24512, "roughEstimateOfSI": 2933, "optimisticSI": 1765, "pessimisticSI": 1096, "roughEstimateOfEIL": 466, "optimisticEIL": 583, "pessimisticEIL": 583}, + {"url": "http://www.thepiratebay.org/", "roughEstimateOfFCP": 3343, "optimisticFCP": 2446, "pessimisticFCP": 2551, "roughEstimateOfFMP": 3531, "optimisticFMP": 2446, "pessimisticFMP": 2551, "roughEstimateOfTTI": 6267, "optimisticTTI": 4252, "pessimisticTTI": 4702, "roughEstimateOfTTFCPUI": 6267, "optimisticTTFCPUI": 4252, "pessimisticTTFCPUI": 4702, "roughEstimateOfSI": 10690, "optimisticSI": 6630, "pessimisticSI": 2551, "roughEstimateOfEIL": 85, "optimisticEIL": 106, "pessimisticEIL": 106}, + {"url": "http://www.thestar.com.my", "roughEstimateOfFCP": 6406, "optimisticFCP": 5208, "pessimisticFCP": 5362, "roughEstimateOfFMP": 7241, "optimisticFMP": 5423, "pessimisticFMP": 6501, "roughEstimateOfTTI": 15922, "optimisticTTI": 10549, "pessimisticTTI": 17762, "roughEstimateOfTTFCPUI": 15922, "optimisticTTFCPUI": 10549, "pessimisticTTFCPUI": 17762, "roughEstimateOfSI": 11235, "optimisticSI": 5714, "pessimisticSI": 5362, "roughEstimateOfEIL": 275, "optimisticEIL": 344, "pessimisticEIL": 344}, + {"url": "http://www.tianya.cn/", "roughEstimateOfFCP": 2024, "optimisticFCP": 1294, "pessimisticFCP": 1294, "roughEstimateOfFMP": 2259, "optimisticFMP": 1294, "pessimisticFMP": 1294, "roughEstimateOfTTI": 8045, "optimisticTTI": 5462, "pessimisticTTI": 7039, "roughEstimateOfTTFCPUI": 8045, "optimisticTTFCPUI": 5462, "pessimisticTTFCPUI": 7039, "roughEstimateOfSI": 8898, "optimisticSI": 5933, "pessimisticSI": 1294, "roughEstimateOfEIL": 2076, "optimisticEIL": 2595, "pessimisticEIL": 2595}, + {"url": "http://www.torrentz.com/", "roughEstimateOfFCP": 519, "optimisticFCP": 305, "pessimisticFCP": 305, "roughEstimateOfFMP": 595, "optimisticFMP": 305, "pessimisticFMP": 305, "roughEstimateOfTTI": 1802, "optimisticTTI": 672, "pessimisticTTI": 717, "roughEstimateOfTTFCPUI": 1824, "optimisticTTFCPUI": 672, "pessimisticTTFCPUI": 767, "roughEstimateOfSI": 1030, "optimisticSI": 773, "pessimisticSI": 305, "roughEstimateOfEIL": 13, "optimisticEIL": 16, "pessimisticEIL": 16}, + {"url": "http://www.tumblr.com/", "roughEstimateOfFCP": 7546, "optimisticFCP": 6314, "pessimisticFCP": 6314, "roughEstimateOfFMP": 7546, "optimisticFMP": 6314, "pessimisticFMP": 6314, "roughEstimateOfTTI": 13238, "optimisticTTI": 10915, "pessimisticTTI": 11309, "roughEstimateOfTTFCPUI": 13238, "optimisticTTFCPUI": 10915, "pessimisticTTFCPUI": 11309, "roughEstimateOfSI": 7546, "optimisticSI": 1280, "pessimisticSI": 6314, "roughEstimateOfEIL": 2035, "optimisticEIL": 2544, "pessimisticEIL": 2544}, + {"url": "http://www.twitpic.com/", "roughEstimateOfFCP": 2004, "optimisticFCP": 1277, "pessimisticFCP": 1277, "roughEstimateOfFMP": 6086, "optimisticFMP": 4939, "pessimisticFMP": 4939, "roughEstimateOfTTI": 8586, "optimisticTTI": 6589, "pessimisticTTI": 6739, "roughEstimateOfTTFCPUI": 8586, "optimisticTTFCPUI": 6589, "pessimisticTTFCPUI": 6739, "roughEstimateOfSI": 2583, "optimisticSI": 1431, "pessimisticSI": 1277, "roughEstimateOfEIL": 981, "optimisticEIL": 1226, "pessimisticEIL": 1226}, + {"url": "http://www.typepad.com/", "roughEstimateOfFCP": 3665, "optimisticFCP": 1826, "pessimisticFCP": 3938, "roughEstimateOfFMP": 4229, "optimisticFMP": 2147, "pessimisticFMP": 3938, "roughEstimateOfTTI": 5732, "optimisticTTI": 3275, "pessimisticTTI": 4817, "roughEstimateOfTTFCPUI": 5732, "optimisticTTFCPUI": 3275, "pessimisticTTFCPUI": 4817, "roughEstimateOfSI": 3665, "optimisticSI": 962, "pessimisticSI": 3938, "roughEstimateOfEIL": 108, "optimisticEIL": 16, "pessimisticEIL": 253}, + {"url": "http://www.verizonwireless.com/", "roughEstimateOfFCP": 3131, "optimisticFCP": 2301, "pessimisticFCP": 2301, "roughEstimateOfFMP": 4107, "optimisticFMP": 3054, "pessimisticFMP": 3054, "roughEstimateOfTTI": 16796, "optimisticTTI": 12895, "pessimisticTTI": 16577, "roughEstimateOfTTFCPUI": 16796, "optimisticTTFCPUI": 12895, "pessimisticTTFCPUI": 16577, "roughEstimateOfSI": 3437, "optimisticSI": 1565, "pessimisticSI": 2301, "roughEstimateOfEIL": 931, "optimisticEIL": 1164, "pessimisticEIL": 1164}, + {"url": "http://www.vevo.com/", "roughEstimateOfFCP": 2592, "optimisticFCP": 1811, "pessimisticFCP": 1811, "roughEstimateOfFMP": 3701, "optimisticFMP": 2668, "pessimisticFMP": 2668, "roughEstimateOfTTI": 24162, "optimisticTTI": 18073, "pessimisticTTI": 26039, "roughEstimateOfTTFCPUI": 14355, "optimisticTTFCPUI": 18073, "pessimisticTTFCPUI": 4248, "roughEstimateOfSI": 4172, "optimisticSI": 2318, "pessimisticSI": 1811, "roughEstimateOfEIL": 2218, "optimisticEIL": 2772, "pessimisticEIL": 2772}, + {"url": "http://www.weather.com/", "roughEstimateOfFCP": 6844, "optimisticFCP": 5676, "pessimisticFCP": 5676, "roughEstimateOfFMP": 6860, "optimisticFMP": 5676, "pessimisticFMP": 5676, "roughEstimateOfTTI": 28641, "optimisticTTI": 22898, "pessimisticTTI": 29561, "roughEstimateOfTTFCPUI": 22576, "optimisticTTFCPUI": 22898, "pessimisticTTFCPUI": 16083, "roughEstimateOfSI": 7932, "optimisticSI": 3209, "pessimisticSI": 5676, "roughEstimateOfEIL": 1338, "optimisticEIL": 1672, "pessimisticEIL": 1672}, + {"url": "http://www.wikipedia.org/", "roughEstimateOfFCP": 1587, "optimisticFCP": 934, "pessimisticFCP": 934, "roughEstimateOfFMP": 1821, "optimisticFMP": 934, "pessimisticFMP": 934, "roughEstimateOfTTI": 5915, "optimisticTTI": 4070, "pessimisticTTI": 4161, "roughEstimateOfTTFCPUI": 5915, "optimisticTTFCPUI": 4070, "pessimisticTTFCPUI": 4161, "roughEstimateOfSI": 2299, "optimisticSI": 1387, "pessimisticSI": 934, "roughEstimateOfEIL": 1682, "optimisticEIL": 2102, "pessimisticEIL": 2102}, + {"url": "http://www.ynet.com/", "roughEstimateOfFCP": 2518, "optimisticFCP": 1744, "pessimisticFCP": 1744, "roughEstimateOfFMP": 2731, "optimisticFMP": 1744, "pessimisticFMP": 1744, "roughEstimateOfTTI": 9865, "optimisticTTI": 3663, "pessimisticTTI": 13483, "roughEstimateOfTTFCPUI": 5439, "optimisticTTFCPUI": 3663, "pessimisticTTFCPUI": 3649, "roughEstimateOfSI": 4689, "optimisticSI": 2718, "pessimisticSI": 1744, "roughEstimateOfEIL": 152, "optimisticEIL": 190, "pessimisticEIL": 190}, + {"url": "http://www.youdao.com/", "roughEstimateOfFCP": 3309, "optimisticFCP": 2463, "pessimisticFCP": 2463, "roughEstimateOfFMP": 3486, "optimisticFMP": 2463, "pessimisticFMP": 2463, "roughEstimateOfTTI": 4186, "optimisticTTI": 2463, "pessimisticTTI": 2463, "roughEstimateOfTTFCPUI": 3486, "optimisticTTFCPUI": 1231, "pessimisticTTFCPUI": 1277, "roughEstimateOfSI": 6077, "optimisticSI": 3376, "pessimisticSI": 2463, "roughEstimateOfEIL": 13, "optimisticEIL": 16, "pessimisticEIL": 16}, + {"url": "http://www.zol.com.cn/", "roughEstimateOfFCP": 2759, "optimisticFCP": 1341, "pessimisticFCP": 2707, "roughEstimateOfFMP": 3128, "optimisticFMP": 1341, "pessimisticFMP": 2707, "roughEstimateOfTTI": 10822, "optimisticTTI": 4970, "pessimisticTTI": 13868, "roughEstimateOfTTFCPUI": 5530, "optimisticTTFCPUI": 4970, "pessimisticTTFCPUI": 2107, "roughEstimateOfSI": 13453, "optimisticSI": 8531, "pessimisticSI": 2707, "roughEstimateOfEIL": 249, "optimisticEIL": 83, "pessimisticEIL": 539} + ] +} From 94eab43600eee06b80e40cbab28c7b433550cbcf Mon Sep 17 00:00:00 2001 From: Patrick Hulce Date: Tue, 5 Jun 2018 13:57:07 -0700 Subject: [PATCH 2/9] add test-lantern script --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 0a2a3173c90b..d70b41004d22 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,7 @@ "test": "yarn lint --quiet && yarn unit && yarn type-check && yarn diff:sample-json", "test-extension": "cd lighthouse-extension && yarn test", "test-viewer": "cd lighthouse-viewer && yarn pptr-test", + "test-lantern": "bash lighthouse-core/scripts/test-lantern.sh", "unit-core": "mocha --reporter dot \"lighthouse-core/test/**/*-test.js\"", "unit-cli": "mocha --reporter dot \"lighthouse-cli/test/**/*-test.js\"", From 2c4d23d8c249a39fa83690f7fcfa8531e333f78f Mon Sep 17 00:00:00 2001 From: Patrick Hulce Date: Wed, 6 Jun 2018 10:14:48 -0700 Subject: [PATCH 3/9] set -e download --- lighthouse-core/scripts/lantern/download-traces.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lighthouse-core/scripts/lantern/download-traces.sh b/lighthouse-core/scripts/lantern/download-traces.sh index 548b8a65fdb6..cc8203b187dc 100755 --- a/lighthouse-core/scripts/lantern/download-traces.sh +++ b/lighthouse-core/scripts/lantern/download-traces.sh @@ -1,5 +1,7 @@ #!/bin/bash +set -e + DIRNAME="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" LH_ROOT_PATH="$DIRNAME/../../.." cd $LH_ROOT_PATH From e51a64c1f1c69f304fd118883262dc6617247a63 Mon Sep 17 00:00:00 2001 From: Patrick Hulce Date: Wed, 6 Jun 2018 10:20:18 -0700 Subject: [PATCH 4/9] temporarily disable other tests --- .travis.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/.travis.yml b/.travis.yml index 71dbc2ad8998..e7b7ac1f145e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -32,14 +32,14 @@ before_script: - sh -e /etc/init.d/xvfb start - yarn build-all script: - - yarn bundlesize - - yarn lint - - yarn unit:silentcoverage - - yarn type-check - - yarn diff:sample-json - - yarn smoke:silentcoverage - - yarn test-extension - - yarn test-viewer + # - yarn bundlesize + # - yarn lint + # - yarn unit:silentcoverage + # - yarn type-check + # - yarn diff:sample-json + # - yarn smoke:silentcoverage + # - yarn test-extension + # - yarn test-viewer - yarn test-lantern # _JAVA_OPTIONS is breaking parsing of compiler output. See #3338. - unset _JAVA_OPTIONS From cb8bd112b6576ce7a3f18c1c88ac91b0a6bdac59 Mon Sep 17 00:00:00 2001 From: Patrick Hulce Date: Wed, 6 Jun 2018 14:56:36 -0700 Subject: [PATCH 5/9] add debug ls --- lighthouse-core/scripts/test-lantern.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lighthouse-core/scripts/test-lantern.sh b/lighthouse-core/scripts/test-lantern.sh index 41757dfc1129..95010c1e83ca 100755 --- a/lighthouse-core/scripts/test-lantern.sh +++ b/lighthouse-core/scripts/test-lantern.sh @@ -24,6 +24,8 @@ fi printf "Lantern files affected!\n\nDownloading test set...\n" "$LH_ROOT/lighthouse-core/scripts/lantern/download-traces.sh" +ls ./lantern-data + printf "\n\nRunning all expectations...\n" "$LH_ROOT/lighthouse-core/scripts/lantern/run-all-expectations.js" From 86c4c22d5e36fdc43fd84e6080e58a4cbb3851e2 Mon Sep 17 00:00:00 2001 From: Patrick Hulce Date: Wed, 6 Jun 2018 15:14:27 -0700 Subject: [PATCH 6/9] modified donwload --- lighthouse-core/scripts/lantern/download-traces.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lighthouse-core/scripts/lantern/download-traces.sh b/lighthouse-core/scripts/lantern/download-traces.sh index cc8203b187dc..2fea8fb9e5fb 100755 --- a/lighthouse-core/scripts/lantern/download-traces.sh +++ b/lighthouse-core/scripts/lantern/download-traces.sh @@ -15,6 +15,7 @@ fi TAR_URL="https://drive.google.com/a/chromium.org/uc?id=1_w2g6fQVLgHI62FApsyUDejZyHNXMLm0&export=download" curl -o lantern-traces.tar.gz -L $TAR_URL +rm -rf lantern-data/ tar -xzf lantern-traces.tar.gz -mv lantern-traces-subset lantern-data +mv lantern-traces-subset/ lantern-data/ rm lantern-traces.tar.gz From 466162b050305efdf5f556a66cbd0c2522d56be1 Mon Sep 17 00:00:00 2001 From: Patrick Hulce Date: Wed, 6 Jun 2018 15:21:12 -0700 Subject: [PATCH 7/9] uncomment travis --- .travis.yml | 16 ++++++++-------- lighthouse-core/scripts/test-lantern.sh | 2 -- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/.travis.yml b/.travis.yml index e7b7ac1f145e..71dbc2ad8998 100644 --- a/.travis.yml +++ b/.travis.yml @@ -32,14 +32,14 @@ before_script: - sh -e /etc/init.d/xvfb start - yarn build-all script: - # - yarn bundlesize - # - yarn lint - # - yarn unit:silentcoverage - # - yarn type-check - # - yarn diff:sample-json - # - yarn smoke:silentcoverage - # - yarn test-extension - # - yarn test-viewer + - yarn bundlesize + - yarn lint + - yarn unit:silentcoverage + - yarn type-check + - yarn diff:sample-json + - yarn smoke:silentcoverage + - yarn test-extension + - yarn test-viewer - yarn test-lantern # _JAVA_OPTIONS is breaking parsing of compiler output. See #3338. - unset _JAVA_OPTIONS diff --git a/lighthouse-core/scripts/test-lantern.sh b/lighthouse-core/scripts/test-lantern.sh index 95010c1e83ca..41757dfc1129 100755 --- a/lighthouse-core/scripts/test-lantern.sh +++ b/lighthouse-core/scripts/test-lantern.sh @@ -24,8 +24,6 @@ fi printf "Lantern files affected!\n\nDownloading test set...\n" "$LH_ROOT/lighthouse-core/scripts/lantern/download-traces.sh" -ls ./lantern-data - printf "\n\nRunning all expectations...\n" "$LH_ROOT/lighthouse-core/scripts/lantern/run-all-expectations.js" From 94be4c5b1f1afcade3dca7b0ddae6f728b112265 Mon Sep 17 00:00:00 2001 From: Patrick Hulce Date: Thu, 14 Jun 2018 12:38:45 -0700 Subject: [PATCH 8/9] exit with 1 if there are changes --- lighthouse-core/scripts/lantern/diff-expectations.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lighthouse-core/scripts/lantern/diff-expectations.js b/lighthouse-core/scripts/lantern/diff-expectations.js index 0fcb17215fb3..ba08785b9011 100755 --- a/lighthouse-core/scripts/lantern/diff-expectations.js +++ b/lighthouse-core/scripts/lantern/diff-expectations.js @@ -26,6 +26,8 @@ if (!fs.existsSync(COMPUTED_PATH) || !fs.existsSync(EXPECTED_PATH)) { throw new Error('Usage $0 '); } +let exitCode = 0; + try { const computedResults = require(COMPUTED_PATH); const expectedResults = require(EXPECTED_PATH); @@ -46,8 +48,11 @@ try { } catch (err) { console.log('❌ FAIL Changes between expected and computed!\n'); console.log(err.stdout.toString()); + exitCode = 1; } } finally { fs.unlinkSync(TMP_COMPUTED); fs.unlinkSync(TMP_EXPECTED); } + +process.exit(exitCode); From 56355bc985961fbce76def1953491d5cc80d924b Mon Sep 17 00:00:00 2001 From: Patrick Hulce Date: Thu, 14 Jun 2018 17:10:41 -0700 Subject: [PATCH 9/9] mega feedback --- .gitignore | 1 + ...assert-master-lantern-values-unchanged.js} | 29 +++++++-------- lighthouse-core/scripts/lantern/constants.js | 16 +++++++++ .../scripts/lantern/download-traces.sh | 7 ++-- ...luate-results.js => print-correlations.js} | 35 ++++++++++--------- ...l-expectations.js => run-on-all-assets.js} | 19 +++++----- ...ons.js => update-master-lantern-values.js} | 20 +++++------ lighthouse-core/scripts/test-lantern.sh | 10 +++--- ...on => lantern-master-computed-values.json} | 2 +- 9 files changed, 81 insertions(+), 58 deletions(-) rename lighthouse-core/scripts/lantern/{diff-expectations.js => assert-master-lantern-values-unchanged.js} (64%) create mode 100644 lighthouse-core/scripts/lantern/constants.js rename lighthouse-core/scripts/lantern/{evaluate-results.js => print-correlations.js} (91%) rename lighthouse-core/scripts/lantern/{run-all-expectations.js => run-on-all-assets.js} (63%) rename lighthouse-core/scripts/lantern/{update-expectations.js => update-master-lantern-values.js} (64%) rename lighthouse-core/test/fixtures/{lantern-expectations.json => lantern-master-computed-values.json} (99%) diff --git a/.gitignore b/.gitignore index f5ed26d626a0..7506288a7d5f 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ node_modules .DS_Store npm-debug.log .vscode +.tmp lighthouse-extension/dist lighthouse-core/third_party/src diff --git a/lighthouse-core/scripts/lantern/diff-expectations.js b/lighthouse-core/scripts/lantern/assert-master-lantern-values-unchanged.js similarity index 64% rename from lighthouse-core/scripts/lantern/diff-expectations.js rename to lighthouse-core/scripts/lantern/assert-master-lantern-values-unchanged.js index ba08785b9011..97020f3d07cb 100755 --- a/lighthouse-core/scripts/lantern/diff-expectations.js +++ b/lighthouse-core/scripts/lantern/assert-master-lantern-values-unchanged.js @@ -11,26 +11,27 @@ const fs = require('fs'); const path = require('path'); const execSync = require('child_process').execSync; +const constants = require('./constants'); -const COMPUTED_INPUT_ARG = process.argv[2] || './lantern-data/lantern-computed.json'; -const COMPUTED_PATH = path.join(process.cwd(), COMPUTED_INPUT_ARG); -const EXPECTED_PATH = path.join(__dirname, '../../test/fixtures/lantern-expectations.json'); +const INPUT_PATH = process.argv[2] || constants.SITE_INDEX_WITH_GOLDEN_WITH_COMPUTED_PATH; +const HEAD_PATH = path.resolve(process.cwd(), INPUT_PATH); +const MASTER_PATH = constants.MASTER_COMPUTED_PATH; -const TMP_DIR = path.join(process.cwd(), '.tmp'); -const TMP_COMPUTED = path.join(TMP_DIR, 'computed.json'); -const TMP_EXPECTED = path.join(TMP_DIR, 'expected.json'); +const TMP_DIR = path.join(__dirname, '../../../.tmp'); +const TMP_HEAD_PATH = path.join(TMP_DIR, 'HEAD-for-diff.json'); +const TMP_MASTER_PATH = path.join(TMP_DIR, 'master-for-diff.json'); if (!fs.existsSync(TMP_DIR)) fs.mkdirSync(TMP_DIR); -if (!fs.existsSync(COMPUTED_PATH) || !fs.existsSync(EXPECTED_PATH)) { +if (!fs.existsSync(HEAD_PATH) || !fs.existsSync(MASTER_PATH)) { throw new Error('Usage $0 '); } let exitCode = 0; try { - const computedResults = require(COMPUTED_PATH); - const expectedResults = require(EXPECTED_PATH); + const computedResults = require(HEAD_PATH); + const expectedResults = require(MASTER_PATH); const sites = []; for (const entry of computedResults.sites) { @@ -39,11 +40,11 @@ try { sites.push({url: entry.url, ...lanternValues}); } - fs.writeFileSync(TMP_COMPUTED, JSON.stringify({sites}, null, 2)); - fs.writeFileSync(TMP_EXPECTED, JSON.stringify(expectedResults, null, 2)); + fs.writeFileSync(TMP_HEAD_PATH, JSON.stringify({sites}, null, 2)); + fs.writeFileSync(TMP_MASTER_PATH, JSON.stringify(expectedResults, null, 2)); try { - execSync(`git --no-pager diff --color=always --no-index ${TMP_EXPECTED} ${TMP_COMPUTED}`); + execSync(`git --no-pager diff --color=always --no-index ${TMP_MASTER_PATH} ${TMP_HEAD_PATH}`); console.log('✅ PASS No changes between expected and computed!'); } catch (err) { console.log('❌ FAIL Changes between expected and computed!\n'); @@ -51,8 +52,8 @@ try { exitCode = 1; } } finally { - fs.unlinkSync(TMP_COMPUTED); - fs.unlinkSync(TMP_EXPECTED); + fs.unlinkSync(TMP_HEAD_PATH); + fs.unlinkSync(TMP_MASTER_PATH); } process.exit(exitCode); diff --git a/lighthouse-core/scripts/lantern/constants.js b/lighthouse-core/scripts/lantern/constants.js new file mode 100644 index 000000000000..01901ea4977b --- /dev/null +++ b/lighthouse-core/scripts/lantern/constants.js @@ -0,0 +1,16 @@ +/** + * @license Copyright 2018 Google Inc. 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. + */ +'use strict'; + +const path = require('path'); + +/* eslint-disable max-len */ + +module.exports = { + SITE_INDEX_WITH_GOLDEN_PATH: './lantern-data/site-index-plus-golden-expectations.json', + SITE_INDEX_WITH_GOLDEN_WITH_COMPUTED_PATH: path.join(__dirname, '../../../.tmp/site-index-plus-golden-expectations-plus-computed.json'), + MASTER_COMPUTED_PATH: path.join(__dirname, '../../test/fixtures/lantern-master-computed-values.json'), +}; diff --git a/lighthouse-core/scripts/lantern/download-traces.sh b/lighthouse-core/scripts/lantern/download-traces.sh index 2fea8fb9e5fb..4984912d8247 100755 --- a/lighthouse-core/scripts/lantern/download-traces.sh +++ b/lighthouse-core/scripts/lantern/download-traces.sh @@ -6,16 +6,17 @@ DIRNAME="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" LH_ROOT_PATH="$DIRNAME/../../.." cd $LH_ROOT_PATH -if [[ -f lantern-data/lantern-expectations.json ]] && ! [[ "$FORCE" ]]; then +if [[ -f lantern-data/site-index-plus-golden-expectations.json ]] && ! [[ "$FORCE" ]]; then echo "Lantern data already detected, done." exit 0 fi +rm -rf lantern-data/ +mkdir lantern-data/ && cd lantern-data/ + # snapshot of ~100 traces with no throttling recorded 2017-12-06 on a HP z840 workstation TAR_URL="https://drive.google.com/a/chromium.org/uc?id=1_w2g6fQVLgHI62FApsyUDejZyHNXMLm0&export=download" curl -o lantern-traces.tar.gz -L $TAR_URL -rm -rf lantern-data/ tar -xzf lantern-traces.tar.gz -mv lantern-traces-subset/ lantern-data/ rm lantern-traces.tar.gz diff --git a/lighthouse-core/scripts/lantern/evaluate-results.js b/lighthouse-core/scripts/lantern/print-correlations.js similarity index 91% rename from lighthouse-core/scripts/lantern/evaluate-results.js rename to lighthouse-core/scripts/lantern/print-correlations.js index d214a1016d8a..f0c758672507 100755 --- a/lighthouse-core/scripts/lantern/evaluate-results.js +++ b/lighthouse-core/scripts/lantern/print-correlations.js @@ -10,14 +10,15 @@ const fs = require('fs'); const path = require('path'); +const constants = require('./constants'); const GOOD_ABSOLUTE_THRESHOLD = 0.2; const OK_ABSOLUTE_THRESHOLD = 0.5; const GOOD_RANK_THRESHOLD = 0.1; -const COMPUTATIONS_INPUT_ARG = process.argv[2] || './lantern-data/lantern-computed.json'; -const COMPUTATIONS_PATH = path.resolve(process.cwd(), COMPUTATIONS_INPUT_ARG); +const INPUT_PATH = process.argv[2] || constants.SITE_INDEX_WITH_GOLDEN_WITH_COMPUTED_PATH; +const COMPUTATIONS_PATH = path.resolve(process.cwd(), INPUT_PATH); if (!fs.existsSync(COMPUTATIONS_PATH)) throw new Error('Usage $0 '); @@ -38,7 +39,7 @@ const totalOk = []; const totalBad = []; /** - * @param {keyof LanternSiteDefinition} metric + * @param {keyof TargetMetrics} metric * @param {keyof LanternMetrics} lanternMetric */ function evaluateBuckets(metric, lanternMetric) { @@ -55,8 +56,7 @@ function evaluateBuckets(metric, lanternMetric) { const rankErrors = []; const percentErrors = []; for (const entry of entries) { - // @ts-ignore - const expected = Math.round(entry[metric]); + const expected = Math.round(entry.wpt3g[metric]); if (expected === 0) continue; const expectedRank = sortedByMetric.indexOf(entry); @@ -125,9 +125,9 @@ evaluateBuckets('speedIndex', 'roughEstimateOfSI'); const total = totalGood.length + totalOk.length + totalBad.length; console.log('\n---- Summary Stats ----'); -console.log(`Good: ${Math.round(totalGood.length / total * 100)}%`); -console.log(`OK: ${Math.round(totalOk.length / total * 100)}%`); -console.log(`Bad: ${Math.round(totalBad.length / total * 100)}%`); +console.log(`Good: ${Math.round((totalGood.length / total) * 100)}%`); +console.log(`OK: ${Math.round((totalOk.length / total) * 100)}%`); +console.log(`Bad: ${Math.round((totalBad.length / total) * 100)}%`); console.log('\n---- Worst10 Sites ----'); for (const entry of totalBad.sort((a, b) => b.rankDiff - a.rankDiff).slice(0, 10)) { @@ -144,14 +144,8 @@ for (const entry of totalBad.sort((a, b) => b.rankDiff - a.rankDiff).slice(0, 10 /** * @typedef LanternSiteDefinition * @property {string} url - * @property {string} tracePath - * @property {string} devtoolsLogPath + * @property {TargetMetrics} wpt3g * @property {LanternMetrics} lantern - * @property {number} [firstContentfulPaint] - * @property {number} [firstMeaningfulPaint] - * @property {number} [timeToFirstInteractive] - * @property {number} [timeToConsistentlyInteractive] - * @property {number} [speedIndex] */ /** @@ -165,6 +159,15 @@ for (const entry of totalBad.sort((a, b) => b.rankDiff - a.rankDiff).slice(0, 10 * @property {number} rankDiffAsPercent */ +/** + * @typedef TargetMetrics + * @property {number} [firstContentfulPaint] + * @property {number} [firstMeaningfulPaint] + * @property {number} [timeToFirstInteractive] + * @property {number} [timeToConsistentlyInteractive] + * @property {number} [speedIndex] + */ + /** * @typedef LanternMetrics * @property {number} optimisticFCP @@ -182,4 +185,4 @@ for (const entry of totalBad.sort((a, b) => b.rankDiff - a.rankDiff).slice(0, 10 * @property {number} roughEstimateOfSI * @property {number} roughEstimateOfTTFCPUI * @property {number} roughEstimateOfTTI - */ + */ diff --git a/lighthouse-core/scripts/lantern/run-all-expectations.js b/lighthouse-core/scripts/lantern/run-on-all-assets.js similarity index 63% rename from lighthouse-core/scripts/lantern/run-all-expectations.js rename to lighthouse-core/scripts/lantern/run-on-all-assets.js index 9b79b1b515a1..0dac3453eaaf 100755 --- a/lighthouse-core/scripts/lantern/run-all-expectations.js +++ b/lighthouse-core/scripts/lantern/run-on-all-assets.js @@ -11,19 +11,20 @@ const fs = require('fs'); const path = require('path'); const execFileSync = require('child_process').execFileSync; +const constants = require('./constants'); -const EXPECTATIONS_INPUT_ARG = process.argv[2] || './lantern-data/lantern-expectations.json'; -const EXPECTATIONS_PATH = path.resolve(process.cwd(), EXPECTATIONS_INPUT_ARG); -const EXPECTATIONS_DIR = path.dirname(EXPECTATIONS_PATH); +const INPUT_PATH = process.argv[2] || constants.SITE_INDEX_WITH_GOLDEN_PATH; +const SITE_INDEX_PATH = path.resolve(process.cwd(), INPUT_PATH); +const SITE_INDEX_DIR = path.dirname(SITE_INDEX_PATH); const RUN_ONCE_PATH = path.join(__dirname, 'run-once.js'); -if (!fs.existsSync(EXPECTATIONS_PATH)) throw new Error('Usage $0 '); +if (!fs.existsSync(SITE_INDEX_PATH)) throw new Error('Usage $0 '); -const expectations = require(EXPECTATIONS_PATH); +const expectations = require(SITE_INDEX_PATH); for (const site of expectations.sites) { - const trace = path.join(EXPECTATIONS_DIR, site.tracePath); - const log = path.join(EXPECTATIONS_DIR, site.devtoolsLogPath); + const trace = path.join(SITE_INDEX_DIR, site.unthrottled.tracePath); + const log = path.join(SITE_INDEX_DIR, site.unthrottled.devtoolsLogPath); console.log('Running', site.url, '...'); const rawOutput = execFileSync(RUN_ONCE_PATH, [trace, log]) @@ -35,5 +36,5 @@ for (const site of expectations.sites) { Object.assign(site, {lantern}); } -const computedSummaryPath = path.join(EXPECTATIONS_DIR, 'lantern-computed.json'); -fs.writeFileSync(computedSummaryPath, JSON.stringify(expectations, null, 2)); +// eslint-disable-next-line max-len +fs.writeFileSync(constants.SITE_INDEX_WITH_GOLDEN_WITH_COMPUTED_PATH, JSON.stringify(expectations, null, 2)); diff --git a/lighthouse-core/scripts/lantern/update-expectations.js b/lighthouse-core/scripts/lantern/update-master-lantern-values.js similarity index 64% rename from lighthouse-core/scripts/lantern/update-expectations.js rename to lighthouse-core/scripts/lantern/update-master-lantern-values.js index 4143af4b2440..79aee894943a 100755 --- a/lighthouse-core/scripts/lantern/update-expectations.js +++ b/lighthouse-core/scripts/lantern/update-master-lantern-values.js @@ -12,20 +12,20 @@ const fs = require('fs'); const path = require('path'); const execFileSync = require('child_process').execFileSync; const prettyJSONStringify = require('pretty-json-stringify'); +const constants = require('./constants'); -const INPUT_PATH = process.argv[2] || './lantern-data/lantern-expectations.json'; -const EXPECTATIONS_PATH = path.resolve(process.cwd(), INPUT_PATH); -const EXPECTATIONS_DIR = path.dirname(EXPECTATIONS_PATH); -const COMPUTED_PATH = path.join(EXPECTATIONS_DIR, 'lantern-computed.json'); -const RUN_ALL_SCRIPT_PATH = path.join(__dirname, 'run-all-expectations.js'); -const OUTPUT_PATH = path.join(__dirname, '../../test/fixtures/lantern-expectations.json'); +const INPUT_PATH = process.argv[2] || constants.SITE_INDEX_WITH_GOLDEN_PATH; +const SITE_INDEX_PATH = path.resolve(process.cwd(), INPUT_PATH); +const HEAD_COMPUTED_PATH = constants.SITE_INDEX_WITH_GOLDEN_WITH_COMPUTED_PATH; +const RUN_ALL_SCRIPT_PATH = path.join(__dirname, 'run-on-all-assets.js'); +const OUTPUT_PATH = constants.MASTER_COMPUTED_PATH; -if (!fs.existsSync(COMPUTED_PATH) || process.env.FORCE) { - if (!fs.existsSync(EXPECTATIONS_PATH)) throw new Error('Usage $0 '); - execFileSync(RUN_ALL_SCRIPT_PATH, [EXPECTATIONS_PATH]); +if (!fs.existsSync(HEAD_COMPUTED_PATH) || process.env.FORCE) { + if (!fs.existsSync(SITE_INDEX_PATH)) throw new Error('Usage $0 '); + execFileSync(RUN_ALL_SCRIPT_PATH, [SITE_INDEX_PATH]); } -const computedResults = require(COMPUTED_PATH); +const computedResults = require(HEAD_COMPUTED_PATH); const sites = []; for (const entry of computedResults.sites) { diff --git a/lighthouse-core/scripts/test-lantern.sh b/lighthouse-core/scripts/test-lantern.sh index 41757dfc1129..49750f156d0d 100755 --- a/lighthouse-core/scripts/test-lantern.sh +++ b/lighthouse-core/scripts/test-lantern.sh @@ -24,11 +24,11 @@ fi printf "Lantern files affected!\n\nDownloading test set...\n" "$LH_ROOT/lighthouse-core/scripts/lantern/download-traces.sh" -printf "\n\nRunning all expectations...\n" -"$LH_ROOT/lighthouse-core/scripts/lantern/run-all-expectations.js" +printf "\n\nRunning lantern on all sites...\n" +"$LH_ROOT/lighthouse-core/scripts/lantern/run-on-all-assets.js" printf "\n\n" -"$LH_ROOT/lighthouse-core/scripts/lantern/evaluate-results.js" +"$LH_ROOT/lighthouse-core/scripts/lantern/print-correlations.js" -printf "\n\nComparing to golden expectations...\n" -"$LH_ROOT/lighthouse-core/scripts/lantern/diff-expectations.js" +printf "\n\nComparing to master computed values...\n" +"$LH_ROOT/lighthouse-core/scripts/lantern/assert-master-lantern-values-unchanged.js" diff --git a/lighthouse-core/test/fixtures/lantern-expectations.json b/lighthouse-core/test/fixtures/lantern-master-computed-values.json similarity index 99% rename from lighthouse-core/test/fixtures/lantern-expectations.json rename to lighthouse-core/test/fixtures/lantern-master-computed-values.json index 09e2c7794857..be568ed1ca2b 100644 --- a/lighthouse-core/test/fixtures/lantern-expectations.json +++ b/lighthouse-core/test/fixtures/lantern-master-computed-values.json @@ -100,4 +100,4 @@ {"url": "http://www.youdao.com/", "roughEstimateOfFCP": 3309, "optimisticFCP": 2463, "pessimisticFCP": 2463, "roughEstimateOfFMP": 3486, "optimisticFMP": 2463, "pessimisticFMP": 2463, "roughEstimateOfTTI": 4186, "optimisticTTI": 2463, "pessimisticTTI": 2463, "roughEstimateOfTTFCPUI": 3486, "optimisticTTFCPUI": 1231, "pessimisticTTFCPUI": 1277, "roughEstimateOfSI": 6077, "optimisticSI": 3376, "pessimisticSI": 2463, "roughEstimateOfEIL": 13, "optimisticEIL": 16, "pessimisticEIL": 16}, {"url": "http://www.zol.com.cn/", "roughEstimateOfFCP": 2759, "optimisticFCP": 1341, "pessimisticFCP": 2707, "roughEstimateOfFMP": 3128, "optimisticFMP": 1341, "pessimisticFMP": 2707, "roughEstimateOfTTI": 10822, "optimisticTTI": 4970, "pessimisticTTI": 13868, "roughEstimateOfTTFCPUI": 5530, "optimisticTTFCPUI": 4970, "pessimisticTTFCPUI": 2107, "roughEstimateOfSI": 13453, "optimisticSI": 8531, "pessimisticSI": 2707, "roughEstimateOfEIL": 249, "optimisticEIL": 83, "pessimisticEIL": 539} ] -} +} \ No newline at end of file