Instantly share code, notes, and snippets.

What would you like to do? polyfill (aka
// @license
// copyright Paul Irish 2015
// is supported everywhere except IE8. For IE8 we use the polyfill
// as Safari 6 doesn't have support for NavigationTiming, we use a timestamp for relative values
// if you want values similar to what you'd get with real, place this towards the head of the page
// but in reality, you're just getting the delta between now() calls, so it's not terribly important where it's placed
if ("performance" in window == false) {
window.performance = {};
} = ( || function () { // thanks IE8
return new Date().getTime();
if ("now" in window.performance == false){
var nowOffset =;
if (performance.timing && performance.timing.navigationStart){
nowOffset = performance.timing.navigationStart
} = function now(){
return - nowOffset;

This comment has been minimized.

JofArnold commented Jun 27, 2013

CoffeeScript version with +new Date() to accommodate IE8

do ->
  # prepare base perf object
  if typeof window.performance=='undefined'
    window.performance = {}
  if not
    nowOffset = +new Date()
    if performance.timing and performance.timing
      nowOffset = performance.timing.navigationStart = ->
      now = +new Date()
      return now - nowOffset

This comment has been minimized.

qxk23 commented Jul 9, 2013

Wondering if line 15 should be:

if (performance.timing && performance.timing.navigationStart){

This comment has been minimized.

justnorris commented Aug 1, 2013

@JofArnold thanks. Exactly what I needed.


This comment has been minimized.

drewwells commented Mar 31, 2014 is not available in IE8. Also, without navigationStart what value is this polyfill? The numbers this polyfill would produce will not be comparable to the real It should do nothing for browsers lacking navigationStart.


This comment has been minimized.

lonce commented May 6, 2014

Thank you!


This comment has been minimized.

ccarterc commented May 29, 2014

This makes it easier for testing. Thanks for the script. Now I don't have to have two versions of performance scripts to juggle.


This comment has been minimized.

ianwremmel commented Jun 16, 2014

For those of us in the corporate world, could you provide a license for this gist?


This comment has been minimized.

JordanDelcros commented Oct 25, 2014

Avoiding conditions:

window.performance = (window.performance || {
    now: function now(){
        return - this.offset;

This comment has been minimized.

Markus-ipse commented Feb 25, 2015

@JordanDelcros That doesn't work in IE9, because it has window.performance (but not


This comment has been minimized.

lukehedger commented Mar 3, 2015


This comment has been minimized.

justluvher commented Jul 13, 2015

thank you~!!!!!!


This comment has been minimized.

bikemule commented Jul 29, 2015

If anyone does Apache Cordova (a.k.a. Phonegap) dev, the iOS web view in there doesn't support performance either. At least not through Evothings workbench. I have yet to test with an actual built Cordova app, but I don't think it will make a difference.


This comment has been minimized.

ti0ma commented May 30, 2016

Thank you!! Solved my problem with Opbeat AngularJS plugin. Also thanks to @lukehedger for creating the bower package!


This comment has been minimized.

rubencodes commented Sep 26, 2016

Wonderful! Thanks. Used this to patch support for iOS 8. Would be nice if offered performance.timing instead of just polyfill...


This comment has been minimized.

triblondon commented Oct 3, 2016

As @rubencodes implies above, now has a polyfill, and the benefit is that it will polyfill for you automatically if needed:


This comment has been minimized.

sfinktah commented Nov 2, 2016

@JofArnold that's not very idiomatic coffee-script, and looks like it needs updating to match the modified gist.

    do ->
      window.performance = {} unless 'performance' of window = if then else -> (new Date).getTime()
      unless 'now' of window.performance
        nowOffset = performance.timing?.navigationStart ? = ->
 - nowOffset

2016 what now?


This comment has been minimized.

ghost commented Aug 28, 2017

*2017. Passing the baton.*

if ( !window.perfomance || ! ) { || ( = function () {
    return new this().getTime();

  ( window.perfomance ||
    ( window.perfomance = {} ) ).now = function () {
      return - offset;

  var offset = ( window.perfomance.timing ||
    ( window.perfomance.timing = {} ) ).navigatorStart ||
      ( window.perfomance.timing.navigatorStart = );

This comment has been minimized.

antoniocapelo commented Oct 9, 2018

^ @ghost just a heads up, the snippet above has a typo: 'perfomance' -> 'performance'

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment