Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
window.performance.now --- polyfill
(function(){
// performance.now already exists
if(window.performance && window.performance.now)
return;
// performance exists and has the necessary methods to hack out the current DOMHighResTimestamp
if(
window.performance &&
window.performance.timing &&
window.performance.timing.navigationStart &&
window.performance.mark &&
window.performance.clearMarks &&
window.performance.getEntriesByName
){
window.performance.now = function(){
window.performance.clearMarks('__PERFORMANCE_NOW__');
window.performance.mark('__PERFORMANCE_NOW__');
return window.performance.getEntriesByName('__PERFORMANCE_NOW__')[0].startTime;
};
return;
}
// All else fails, can't access a DOMHighResTimestamp, use a boring old Date...
window.performance = window.performance || {};
var start = (new Date()).valueOf();
window.performance.now = function(){
return (new Date()).valueOf() - start;
};
})();
@jalbam

This comment has been minimized.

Copy link

commented Jul 21, 2019

Hello,

I have mixed this polyfill with Paul Irish's (https://gist.github.com/paulirish/5438650) and modifier some code:

'use strict';

// @license http://opensource.org/licenses/MIT
// copyright Paul Irish 2015
// Added code by Aaron Levine from: https://gist.github.com/Aldlevine/3f716f447322edbb3671
// Some modifications by Joan Alba Maldonado.
// 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
// Gist: https://gist.github.com/jalbam/cc805ac3cfe14004ecdf323159ecf40e
// TODO: Think about adding vendor prefixes.
if (!Date.now) { Date.now = function() { return new Date().getTime(); } }
(function()
{
	if (window.performance && window.performance.now) { return; }

	window.performance = window.performance || {};

	if
	(
		window.performance.timing && window.performance.timing.navigationStart &&
		window.performance.mark &&
		window.performance.clearMarks &&
		window.performance.getEntriesByName
	)
	{
		window.performance.now = function()
		{
			window.performance.clearMarks('__PERFORMANCE_NOW__');
			window.performance.mark('__PERFORMANCE_NOW__');
			return window.performance.getEntriesByName('__PERFORMANCE_NOW__')[0].startTime;
		};
	}
	else if ("now" in window.performance === false)
	{
		var nowOffset = Date.now();

		if (window.performance.timing && window.performance.timing.navigationStart)
		{
			nowOffset = window.performance.timing.navigationStart
		}

		window.performance.now = function now()
		{
			return Date.now() - nowOffset;
		}
	}
})();

I have placed it in this gist: https://gist.github.com/jalbam/cc805ac3cfe14004ecdf323159ecf40e

Any comments will be welcome. Thank you very much.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.