Instantly share code, notes, and snippets.

Embed
What would you like to do?
performance.now() polyfill (aka perf.now())
// @license http://opensource.org/licenses/MIT
// copyright Paul Irish 2015
// Date.now() is supported everywhere except IE8. For IE8 we use the Date.now polyfill
// github.com/Financial-Times/polyfill-service/blob/master/polyfills/Date.now/polyfill.js
// as Safari 6 doesn't have support for NavigationTiming, we use a Date.now() timestamp for relative values
// if you want values similar to what you'd get with real perf.now, 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
(function(){
if ("performance" in window == false) {
window.performance = {};
}
Date.now = (Date.now || function () { // thanks IE8
return new Date().getTime();
});
if ("now" in window.performance == false){
var nowOffset = Date.now();
if (performance.timing && performance.timing.navigationStart){
nowOffset = performance.timing.navigationStart
}
window.performance.now = function now(){
return Date.now() - nowOffset;
}
}
})();
@JofArnold

This comment has been minimized.

Show comment
Hide comment
@JofArnold

JofArnold 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 window.performance.now
    nowOffset = +new Date()
    if performance.timing and performance.timing
      nowOffset = performance.timing.navigationStart
    window.performance.now = ->
      now = +new Date()
      return now - nowOffset

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 window.performance.now
    nowOffset = +new Date()
    if performance.timing and performance.timing
      nowOffset = performance.timing.navigationStart
    window.performance.now = ->
      now = +new Date()
      return now - nowOffset
@qxk23

This comment has been minimized.

Show comment
Hide comment
@qxk23

qxk23 Jul 9, 2013

Wondering if line 15 should be:

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

qxk23 commented Jul 9, 2013

Wondering if line 15 should be:

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

This comment has been minimized.

Show comment
Hide comment
@justnorris

justnorris Aug 1, 2013

@JofArnold thanks. Exactly what I needed.

justnorris commented Aug 1, 2013

@JofArnold thanks. Exactly what I needed.

@drewwells

This comment has been minimized.

Show comment
Hide comment
@drewwells

drewwells Mar 31, 2014

Date.now() 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 performance.now(). It should do nothing for browsers lacking navigationStart.

drewwells commented Mar 31, 2014

Date.now() 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 performance.now(). It should do nothing for browsers lacking navigationStart.

@lonce

This comment has been minimized.

Show comment
Hide comment
@lonce

lonce May 6, 2014

Thank you!

lonce commented May 6, 2014

Thank you!

@ccarterc

This comment has been minimized.

Show comment
Hide comment
@ccarterc

ccarterc 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.

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.

@ianwremmel

This comment has been minimized.

Show comment
Hide comment
@ianwremmel

ianwremmel Jun 16, 2014

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

ianwremmel commented Jun 16, 2014

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

@JordanDelcros

This comment has been minimized.

Show comment
Hide comment
@JordanDelcros

JordanDelcros Oct 25, 2014

Avoiding conditions:

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

JordanDelcros commented Oct 25, 2014

Avoiding conditions:

window.performance = (window.performance || {
    offset: Date.now(),
    now: function now(){
        return Date.now() - this.offset;
    }
});
@Markus-ipse

This comment has been minimized.

Show comment
Hide comment
@Markus-ipse

Markus-ipse Feb 25, 2015

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

Markus-ipse commented Feb 25, 2015

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

@lukehedger

This comment has been minimized.

Show comment
Hide comment
@lukehedger

lukehedger commented Mar 3, 2015

@justluvher

This comment has been minimized.

Show comment
Hide comment
@justluvher

justluvher Jul 13, 2015

thank you~!!!!!!

justluvher commented Jul 13, 2015

thank you~!!!!!!

@bikemule

This comment has been minimized.

Show comment
Hide comment
@bikemule

bikemule 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.

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.

@ti0ma

This comment has been minimized.

Show comment
Hide comment
@ti0ma

ti0ma May 30, 2016

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

ti0ma commented May 30, 2016

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

@rubencodes

This comment has been minimized.

Show comment
Hide comment
@rubencodes

rubencodes Sep 26, 2016

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

rubencodes commented Sep 26, 2016

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

@triblondon

This comment has been minimized.

Show comment
Hide comment
@triblondon

triblondon Oct 3, 2016

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

https://polyfill.io/v2/polyfill.min.js?features=performance.now

triblondon commented Oct 3, 2016

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

https://polyfill.io/v2/polyfill.min.js?features=performance.now

@sfinktah

This comment has been minimized.

Show comment
Hide comment
@sfinktah

sfinktah 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
      Date.now = if Date.now then Date.now else -> (new Date).getTime()
      unless 'now' of window.performance
        nowOffset = performance.timing?.navigationStart ? Date.now()
        window.performance.now = ->
          Date.now() - nowOffset

2016 what now?

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
      Date.now = if Date.now then Date.now else -> (new Date).getTime()
      unless 'now' of window.performance
        nowOffset = performance.timing?.navigationStart ? Date.now()
        window.performance.now = ->
          Date.now() - nowOffset

2016 what now?

@ghost

This comment has been minimized.

Show comment
Hide comment
@ghost

ghost Aug 28, 2017

*2017. Passing the baton.*

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

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

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

ghost commented Aug 28, 2017

*2017. Passing the baton.*

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

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

  var offset = ( window.perfomance.timing ||
    ( window.perfomance.timing = {} ) ).navigatorStart ||
      ( window.perfomance.timing.navigatorStart = Date.now() );
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment