Motivation
1. You write a new test to confirm a JavaScript-related performance speculation
2. You click
3. Your test runs in a bunch of browsers
Glossary
JSperf.com is the site where all you JavaScript performance guesswork should go to die or be confirmed. You know how the old wise people say "JSperf URL or it didn't happen! Now off my lawn!". Yup, that jsperf.com
WebPagetest.org (WPT) is the site where you get answers to the ol' question: "Why do people say my oowsome site is slow? And what should I do about it?"
Bookmarklet is a little piece of JavaScript you conveniently access from your browser bookmarks and inject into other non-suspecting sites.
Github is where you host code.
Bookmaker tool makes a bookmarklet from a .js file URL (probably hosted on github)
Trouble in paradise
These days we're so happy and spoiled with all these amazing tools around us. And yet, when you create a JSPerf test, you have to open all these browsers and run the test everywhere. Even IE. And, when on Mac, IE is usually not readily available. Plus it comes in a bunch versions - from almost-but-not-quite-forgotten IE6, all the way to IE10 The Greatest - and they have different, sometimes contradicting, performance characterics.
To the rescue: WPT
WebPagetest has: a/ ability to run in a bunch of browsers and b/ an API
The bookmarklet
The bookmarklet. It's here, on github
It starts by inquiring about your WPT API key. I know, you have to get one. You can read the API docs on how to get one, but let me save you the trip: you just need to ask pmeenan@[the tool's domain].org for a key. Politely. Tell him I sent you. Promise not to abuse.
var key = localStorage.wpt_key; if (!key) { var prompt = window.__proto__.prompt; key = prompt('Your WebPageTest API key, please?'); if (!key) { return gameOver(); } localStorage.wpt_key = key; }
The key is stored in your localStorage
so you don't have to paste it all the time.
Oh, you may wonder what's up with that:
var prompt = window.__proto__.prompt; prompt('Message...');
Looks like something somewhere on jsperf is doing window.prompt = function(){}
, same for window.open
and probably others. Makes sense, you don't want popup-y stuff (by the thousands) while running a test a gazilion times. So the bookmarklet has to go the window.__proto__
for the original prompt
Moving on.
Setting up the constant params of the API call. The variable param will be the location
which will tell what browser to use. We also give the (undocumented) time
a value of 60s, so that the test has time to run. We also want only one run and just the first run (no full cache run).
The URL to test will be the current page loaded in jsperf.com which is where you run the bookmarklet. And we'll append #run
for autorun.
// base params var wpt = 'http://www.webpagetest.org/runtest.php?'; var params = { k: key, time: 60, runs: 1, fvonly: 1, url: 'http://jsperf.com' + location.pathname + '#run' }; Object .keys(params) .forEach(function(key) { wpt += key + '=' + encodeURIComponent(params[key]) + '&'; });
Finally, setup the locations with browsers IE6,7,8,9,10 and open all these browser windows:
var locations = localStorage.wpt_locations; if (!locations) { locations = ['Dulles_IE6', 'Dulles_IE7', 'Dulles_IE8', 'Dulles_IE9', 'Dulles_IE10']; } // pop some windows up var open = window.__proto__.open; locations.forEach(function(loco){ open(wpt + 'location=' + encodeURIComponent(loco)); });
Again, the full source is here on github
Github has a "raw" version, e.g. this so we take this url, paste it in the bookmaker tool and we get a nice installable bookmarklet link.
Install
Drag this link to you bookmarks:
Run
1. Go to any jsperf test, e.g. http://jsperf.com/array-proto-vs/3
2. Click the bookmarklet
3. Observe 5 new tabs with 5 IE versions running your test!
More browsers
In addition to the browsers (locations) I've defined you can always add more, like Chrome and Firefox. However you probably have these already handy so no need to kill WPT's servers. But the option is there, just edit your localStorage.wpt_locations
Thanks for reading! Comments welcome!
Comments? Feedback? Find me on Twitter, Mastodon, Bluesky, LinkedIn, Threads