<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="">tldr - i ran a crude experiment which suggests es6 doesn’t affect v8-engine’s intrinsic parsing-performance much to significantly impact webpage load-times (can someone verify that v8 v4.1.0.21 does NOT support es6 to confirm i have datapoint for @ least one non-es6 engine?).</div><div class=""><br class=""></div><div class=""><br class=""></div><div class="">so i did something similar to what @kdex suggested, and ran a script testing onload performance with each version of electron-browser for alexa's top 10 global sites.  then plotted the datapoints of onload-time-performance vs. v8-engine versions. there doesn’t seem to be any obvious conclusions to draw from the data.</div><div class=""><div class=""><br class=""></div><div class="">the visualized results are available @ <a href="https://kaizhu256.github.io/node-electron-onload-test/result.html" class="">https://kaizhu256.github.io/node-electron-onload-test/result.html</a>.</div></div><div class=""><br class=""></div><div class=""><img apple-inline="yes" id="8AA9A629-D671-435E-8B5B-A23BED99261B" src="cid:1EF360D2-B824-430C-9FBD-80432C7C0968" class=""><img apple-inline="yes" id="7EAF49C8-F858-4682-9272-0EBEC64BC8CC" src="cid:788A2A17-ACF3-421F-AE98-ED625335AAA5" class=""><img apple-inline="yes" id="B55AAADA-852F-4014-9404-3FE16F406FA4" src="cid:2B2E506C-5B16-41B7-8AEB-9B400EDA8F38" class=""><img apple-inline="yes" id="6EE01162-0948-4079-90D1-4F88A7FC96C5" src="cid:86B822E5-1F63-44EA-ACE5-57C9141DA6C5" class=""><img apple-inline="yes" id="E088301F-B848-44CC-9E4E-6F89C5524AF7" src="cid:E4C2F3BD-4DFC-4634-8B4A-9BB329B0DBAD" class=""><img apple-inline="yes" id="23A3D5DF-CB7C-4D8F-A67B-2AED283A4DE5" src="cid:315C0A39-4442-4B83-ABFB-3748EFB615F3" class=""><img apple-inline="yes" id="E4EB061E-D52F-42CB-8873-8E4C764979E3" src="cid:5DDB9FC5-5205-4CE7-A70B-52A8551E3CEE" class=""><img apple-inline="yes" id="BA889A87-EA9C-40B5-AC2A-C4A0363A7A79" src="cid:1A72CBE9-AEE1-40D1-B226-E6130301E215" class=""><img apple-inline="yes" id="3041337A-8875-4E68-95A1-7E839EBABA22" src="cid:15939428-82B8-45B8-AE1B-DB93501190D2" class=""><img apple-inline="yes" id="5AF15A56-4CA5-46C1-B52F-7124F3363596" src="cid:C61D4ABD-5F20-408D-B8E8-E8BAF681BEC3" class=""><img apple-inline="yes" id="8929C402-9A75-4623-93E6-5C8233ACC92C" src="cid:C223C5BF-F3ED-4D43-A4EA-C330F7D2E604" class=""></div><div class=""><img apple-inline="yes" id="BB755C48-4F52-45A0-A444-B401CBB0F9C0" src="cid:9715BE5A-593A-4493-A0E7-466F661EEC6B" class=""></div><div class=""><div class="">you can reproduce the experiment with the following script:</div><div class=""><br class=""></div><div class="">```javascript</div><div class=""><div class="">/*</div><div class="">lib.electron_onload_test.js</div><div class=""><br class=""></div><div class="">this function will test the onload performance of the given url</div><div class=""><br class=""></div><div class=""># example usage 1:</div><div class="">mkdir -p node_modules</div><div class="">npm install electron-lite --electron-version=v1.1.1</div><div class="">url=<a href="https://www.google.com" class="">https://www.google.com</a> node_modules/.bin/electron lib.electron_onload_test.js</div><div class=""><br class=""></div><div class=""><br class=""></div><div class=""><br class=""></div><div class=""># example usage 2:</div><div class="">printf "" > "$HOME/electron.log"</div><div class="">rm -f /tmp/electron.done</div><div class="">for vv in \</div><div class="">    v0.24.0 \</div><div class="">    v0.25.1 \</div><div class="">    v0.26.1 \</div><div class="">    v0.27.1 \</div><div class="">    v0.28.1 \</div><div class="">    v0.29.1 \</div><div class="">    v0.30.1 \</div><div class="">    v0.31.1 \</div><div class="">    v0.32.1 \</div><div class="">    v0.33.1 \</div><div class="">    v0.34.1 \</div><div class="">    v0.35.1 \</div><div class="">    v0.36.1 \</div><div class="">    v0.37.1 \</div><div class="">    v1.0.1 \</div><div class="">    v1.1.1 \</div><div class="">    v1.2.1 \</div><div class="">    v1.3.1 \</div><div class="">    v1.4.1 \</div><div class="">    v1.5.1 \</div><div class="">    v1.6.1 \</div><div class="">    v1.7.1</div><div class="">do</div><div class="">    mkdir -p node_modules</div><div class="">    npm install electron-lite --electron-version="$vv"</div><div class="">    # <a href="https://en.wikipedia.org/wiki/List_of_most_popular_websites" class="">https://en.wikipedia.org/wiki/List_of_most_popular_websites</a></div><div class="">    for uu in \</div><div class="">        <a href="https://www.google.com" class="">https://www.google.com</a> \</div><div class="">        <a href="https://www.youtube.com" class="">https://www.youtube.com</a> \</div><div class="">        <a href="https://www.facebook.com" class="">https://www.facebook.com</a> \</div><div class="">        <a href="https://www.baidu.com" class="">https://www.baidu.com</a> \</div><div class="">        <a href="https://en.wikipedia.org/wiki/Main_Page" class="">https://en.wikipedia.org/wiki/Main_Page</a> \</div><div class="">        <a href="https://www.google.co.in" class="">https://www.google.co.in</a> \</div><div class="">        <a href="https://www.yahoo.com" class="">https://www.yahoo.com</a> \</div><div class="">        <a href="https://www.reddit.com" class="">https://www.reddit.com</a> \</div><div class="">        <a href="http://www.qq.com" class="">http://www.qq.com</a> \</div><div class="">        <a href="https://world.taobao.com" class="">https://world.taobao.com</a></div><div class="">    do</div><div class="">        for ii in 1 2 3 4 5 6 7 8 9 10</div><div class="">        do</div><div class="">            (url="$uu" node_modules/.bin/electron lib.electron_onload_test.js 2>&1 | \</div><div class="">                tee -a "$HOME/electron.log") &</div><div class="">            for ii in \</div><div class="">                 1  2  3  4  5  6  7  8  9 10 \</div><div class="">                11 12 13 14 15 16 17 18 19 20 \</div><div class="">                21 22 23 24 25 26 27 28 29 30</div><div class="">            do</div><div class="">                sleep 1</div><div class="">                if [ -f /tmp/electron.done ]</div><div class="">                then</div><div class="">                    break</div><div class="">                fi</div><div class="">            done</div><div class="">            rm -f /tmp/electron.done</div><div class="">            killall Electron electron 2>/dev/null</div><div class="">            sleep 1</div><div class="">        done</div><div class="">    done</div><div class="">done</div><div class="">*/</div><div class=""><br class=""></div><div class=""><br class=""></div><div class=""><br class=""></div><div class="">/*jslint</div><div class="">    bitwise: true,</div><div class="">    browser: true,</div><div class="">    maxerr: 8,</div><div class="">    maxlen: 96,</div><div class="">    node: true,</div><div class="">    nomen: true,</div><div class="">    regexp: true,</div><div class="">    stupid: true</div><div class="">*/</div><div class="">(function () {</div><div class="">    'use strict';</div><div class="">    var local;</div><div class="">    local = {};</div><div class="">    // inject onload timer</div><div class="">    if (typeof window === 'object') {</div><div class="">        local.now = Date.now() - 1000;</div><div class="">        window.addEventListener('load', function () {</div><div class="">            // wait 1000 ms for async loaders to finish</div><div class="">            setTimeout(function () {</div><div class="">                console.error('onLoadTime ' + (Date.now() - local.now));</div><div class="">            }, 1000);</div><div class="">        });</div><div class="">        return;</div><div class="">    }</div><div class="">    if (!process.versions.electron) {</div><div class="">        return;</div><div class="">    }</div><div class="">    // npm install electron-lite</div><div class="">    if (!require('fs').existsSync('node_modules/electron-lite') ||</div><div class="">            process.env.npm_config_electron_version) {</div><div class="">        require('child_process').spawnSync('mkdir', [</div><div class="">            '-p',</div><div class="">            'node_modules'</div><div class="">        ], { stdio: ['ignore', 1, 2] });</div><div class="">    }</div><div class="">    // wait for electron to init</div><div class="">    (process.versions.electron >= '0.35'</div><div class="">        ? require('electron').app</div><div class="">        : require('app')).once('ready', function () {</div><div class="">        // init local</div><div class="">        local = { frame: false, height: 768, width: 1024, x: 0, y: 0 };</div><div class="">        // init browserWindow;</div><div class="">        local.BrowserWindow = (process.versions.electron >= '0.35'</div><div class="">            ? require('electron').BrowserWindow</div><div class="">            : require('browser-window'));</div><div class="">        local.browserWindow = new local.BrowserWindow(local);</div><div class="">        // title</div><div class="">        local.browserWindow.on('page-title-updated', function (event, title) {</div><div class="">            if (event && title.indexOf('onLoadTime ') !== 0) {</div><div class="">                return;</div><div class="">            }</div><div class="">            local.tmp = JSON.parse(JSON.stringify(process.versions));</div><div class="">            local.tmp.arch = process.arch;</div><div class="">            local.tmp.onLoadTime = title.split(' ')[1];</div><div class="">            local.tmp.platform = process.platform;</div><div class="">            local.tmp.timestamp = new Date().toISOString();</div><div class="">            local.tmp.url = process.env.url;</div><div class="">            local.result = {};</div><div class="">            Object.keys(local.tmp).sort().forEach(function (key) {</div><div class="">                local.result[key] = local.tmp[key];</div><div class="">            });</div><div class="">            console.log();</div><div class="">            console.log(title + ' - ' + local.result.url);</div><div class="">            console.log(JSON.stringify(local.result));</div><div class="">            console.log();</div><div class="">            require('fs').writeFileSync('/tmp/electron.done', new Date().toISOString());</div><div class="">            process.exit(0);</div><div class="">        });</div><div class="">/* jslint-ignore-begin */</div><div class="">require('fs').writeFileSync('/tmp/electron.webview.html', '\</div><div class=""><style>\n\</div><div class="">body {\n\</div><div class="">  border: 1px solid black;\n\</div><div class="">  margin: 0;\n\</div><div class="">  padding: 0;\n\</div><div class="">}\n\</div><div class=""></style>\n\</div><div class=""><webview\n\</div><div class="">    id="webview1"\n\</div><div class="">    preload="' +  __filename + '"\n\</div><div class="">    src="' + process.env.url + '"\n\</div><div class="">    style="border: none;height: 100%;margin: 0;padding: 0;width: 100%;"\n\</div><div class="">>\n\</div><div class=""></webview>\n\</div><div class=""><script>\n\</div><div class="">(function () {\n\</div><div class="">    var local;\n\</div><div class="">    local = {};\n\</div><div class="">    local.webview1 = document.querySelector("#webview1");\n\</div><div class="">    local.webview1.addEventListener("console-message", function (event) {\n\</div><div class="">        if (event.message.indexOf("onLoadTime ") === 0) {\n\</div><div class="">            console.log(event.message);\n\</div><div class="">            document.title = event.message;\n\</div><div class="">        }\n\</div><div class="">    });\n\</div><div class="">}());\n\</div><div class=""></script>\n\</div><div class="">');</div><div class="">/* jslint-ignore-end */</div><div class="">        // open url</div><div class="">        local.url = '<a href="file:///tmp/electron.webview.html" class="">file:///tmp/electron.webview.html</a>';</div><div class="">        (local.browserWindow.loadURL || local.browserWindow.loadUrl).bind(</div><div class="">            local.browserWindow</div><div class="">        )(local.url, {</div><div class="">            userAgent: local.modeBrowserTest === 'scrape' &&</div><div class="">                'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 ' +</div><div class="">                '(KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36'</div><div class="">        });</div><div class="">    });</div><div class="">}());</div></div><div class="">```</div></div><div class=""><br class=""></div><br class=""><div><blockquote type="cite" class=""><div class="">On Jun 23, 2017, at 11:32 AM, kdex <<a href="mailto:kdex@kdex.de" class="">kdex@kdex.de</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div class="">For what it's worth, if you're only interested in v8, have a look at the <br class="">"Performance" panel in DevTools. You can inspect "Parse" and "Compile" time by <br class="">in the Bottom-Up view, given that you've enabled `Timeline: V8 Runtime Call <br class="">Stats on Timeline` in the hidden options of`Experiments`.<br class=""><br class="">On Friday, June 23, 2017 6:19:20 AM CEST kdex wrote:<br class=""><blockquote type="cite" class=""><blockquote type="cite" class=""><blockquote type="cite" class="">First of all, ECMAScript requires an environment, which may or may not<br class="">be<br class="">a browser. So it might not necessarily make sense to assume "web pages"<br class="">or<br class="">browsers in the first place.<br class=""></blockquote><br class="">wrong. all proposals eventually end up creeping into “web pages” or<br class="">browsers, either by adventurous coders or frameworks that lack clear<br class="">boundary separation between client / server code.<br class=""></blockquote><br class="">"Wrong"? It seems that you are confused about how the language works. Feel<br class="">free to read this[1] section of the language specification.<br class=""><br class=""><blockquote type="cite" class="">both parse-time and [first-run] compile-time.  the intent is to vet most<br class="">language-changing proposals for their impact on initial webpage “freeze"<br class="">due to increased parse-time and compile-time complexity.<br class=""></blockquote><br class="">AFAIK, ECMAScript doesn't force implementers to "compile" anything, i.e. run<br class="">a native code generation step as popular engines do. As you're more or less<br class="">dealing with engine-specifics here, you're leaving ECMAScript territory, so<br class="">this would likely be the wrong mailing list. The same really applies to<br class="">parse time; the language specification doesn't specify a parser, but a<br class="">grammar. The performance really depends on how the parser is implemented,<br class="">as well as on the type of grammar/amount of look-ahead needed.<br class=""><br class=""><blockquote type="cite" class="">hypothetically, can an enterprising individual provide a graph of 1)<br class="">combined-time to parse-and-compile jquery vs 2) browser-version-history<br class="">for<br class="">desktop chrome and firefox since 2015?<br class=""></blockquote><br class="">I'm reading this as "Could I create a graph that plots a specific browser<br class="">version on the x axis and parse time + compile time on the y axis?", and the<br class="">answer would be 'yes'. As a side note, do note that *absolute* time is a<br class="">terrible metric here, as device specs can differ by a lot and aren't<br class="">actually representative for anything but themselves. Relative times should<br class="">be preferred. Nonetheless, if you want to gather this data, you can look up<br class="">the respective engine versions that were used for the browser versions in<br class="">question, edit their source to measure the intervals that you find<br class="">interesting and then compile and run them.<br class=""><br class=""><blockquote type="cite" class="">yes, relevant proposals should consider the implementation-specific<br class="">compile-time of engines<br class=""></blockquote><br class="">Should they really? If a parser is badly implemented, it should be fixed,<br class="">not worked around. Again, it's really a question of the type of grammar and<br class="">the type of parser used. The features involved are second nature, at least<br class="">for the metrics you're trying to measure.<br class=""><br class=""><blockquote type="cite" class="">as an added precaution against breaking the web.<br class=""></blockquote><br class="">This is not "breaking the web", because we're not talking about websites<br class="">that worked once, but don't work anymore, given the same code. We're simply<br class="">talking about "parse and compile" performance here.<br class=""><br class="">[1] <a href="https://tc39.github.io/ecma262/#sec-overview" class="">https://tc39.github.io/ecma262/#sec-overview</a><br class=""><br class="">On Friday, June 23, 2017 5:37:17 AM CEST kai zhu wrote:<br class=""><blockquote type="cite" class=""><blockquote type="cite" class="">First of all, ECMAScript requires an environment, which may or may not<br class="">be<br class="">a<br class="">browser. So it might not necessarily make sense to assume "web pages" or<br class="">browsers in the first place.<br class=""></blockquote><br class="">wrong. all proposals eventually end up creeping into “web pages” or<br class="">browsers, either by adventurous coders or frameworks that lack clear<br class="">boundary separation between client / server code.<br class=""><br class=""><blockquote type="cite" class="">is "load time" equivalent<br class="">to "parse time"? Is it "compile time"? Is it both?<br class=""></blockquote><br class="">both parse-time and [first-run] compile-time.  the intent is to vet most<br class="">language-changing proposals for their impact on initial webpage “freeze"<br class="">due to increased parse-time and compile-time complexity.<br class=""><br class=""><blockquote type="cite" class="">Could you state your question more precisely, please?<br class=""></blockquote><br class="">hypothetically, can an enterprising individual provide a graph of 1)<br class="">combined-time to parse-and-compile jquery vs 2) browser-version-history<br class="">for<br class="">desktop chrome and firefox since 2015?<br class=""><br class=""><blockquote type="cite" class="">Anything else [compile-time] is mostly implementation-<br class="">specific and thus varies from engine to engine.<br class=""></blockquote><br class="">yes, relevant proposals should consider the implementation-specific<br class="">compile-time of engines as an added precaution against breaking the web.<br class=""><br class="">On 22 Jun, 2017, at 8:20, <a href="mailto:es-discuss-request@mozilla.org" class="">es-discuss-request@mozilla.org</a> wrote:<br class=""><blockquote type="cite" class="">From: kdex <<a href="mailto:kdex@kdex.de" class="">kdex@kdex.de</a>><br class="">Subject: Re: are there metrics on how es6 and future proposals affect<br class="">javascript load-time for webpages? Date: 22 June, 2017 8:20:16 HKT<br class="">To: <a href="mailto:es-discuss@mozilla.org" class="">es-discuss@mozilla.org</a><br class=""><br class=""><br class="">I don't think that this is a well-defined question. Is "load time"<br class="">equivalent to "parse time"? Is it "compile time"? Is it both? Is it<br class="">something else? Are we talking about engines that don't generate native<br class="">code and thus maybe "interpretation time"? What are we measuring when<br class="">you<br class="">say "JavaScript load time"?<br class=""><br class="">First of all, ECMAScript requires an environment, which may or may not<br class="">be<br class="">a<br class="">browser. So it might not necessarily make sense to assume "web pages" or<br class="">browsers in the first place.<br class=""><br class="">Aside from that, a great deal of "load time" (?) will likely consist of<br class="">the<br class="">time needed to parse the source code. Anything else is mostly<br class="">implementation- specific and thus varies from engine to engine.<br class=""><br class="">Could you state your question more precisely, please?<br class=""><br class="">On Thursday, June 22, 2017 1:59:05 AM CEST kai zhu wrote:<br class=""><blockquote type="cite" class="">and should future proposals take load-time performance into account?<br class=""><br class="">hi, i’m a new subscriber, and apologies if this seems like a newbie<br class="">question.<br class=""><br class="">a bit of trivia - i remember long ago (maybe 2010?) a website called<br class="">“great<br class="">computer language shootout” or something had d8 consistently having the<br class="">fastest load-time of all interpreted languages benchmarked.  i recent<br class="">google-search led me to maybe the same website<br class="">(<a href="http://benchmarksgame.alioth.debian.org" class="">http://benchmarksgame.alioth.debian.org</a>), but i can no longer find<br class="">load-time stats.<br class=""><br class="">-kai</blockquote></blockquote></blockquote></blockquote>_______________________________________________<br class="">es-discuss mailing list<br class=""><a href="mailto:es-discuss@mozilla.org" class="">es-discuss@mozilla.org</a><br class="">https://mail.mozilla.org/listinfo/es-discuss<br class=""></div></div></blockquote></div><br class=""></body></html>