ReferenceError: performance is not defined when using performance.now()

JavascriptTypescriptFrontend

Javascript Problem Overview


I am getting an error ReferenceError: performance is not defined when trying to use performance.now() to measure the execution time of a function call:

export async function find(someId: string, ctx: context.IContext) {
      
      try {
        var t0 = performance.now();
    
        var res = someModel.find(someId, ctx.cookies);
    
        var t1 = performance.now();
        console.log("Call to find took " + (t1 - t0) + " milliseconds.");
    
        return res;
      } catch (err) {
        console.error(err);
        throw err;
      }
    }

Any ideas how I can fix this?

Javascript Solutions


Solution 1 - Javascript

I know this is tagged front-end but if anyone comes across this looking for a node.js solution (like me), you need to first require performance from the perf_hooks module (available in node 8.5+).

const {performance} = require('perf_hooks');
const t0 = performance.now();
...

Solution 2 - Javascript

Since the 'perf_hook' module exports multiple constructs (objects, functions, constants, etc.), you will need to explicitly specify which construct you wish to use. In this case, you need the performance construct. The declaration can be done in two ways:

const performance = require('perf_hooks').performance;

or

const { performance } = require('perf_hooks'); //object destructuring

Solution 3 - Javascript

You will lose type information when using require, so the best way to import "performance" with TypeScript is using an import statement:

import {performance, PerformanceObserver} from 'perf_hooks';

const observer = new PerformanceObserver(items => items.getEntries().forEach((entry) => console.log(entry)));    
observer.observe({entryTypes: ['measure']});

performance.mark('start');
performance.mark('stop');
performance.measure('Measurement', 'start', 'stop');

Also make sure that you declared @types/node in your "dependencies" of "package.json".

Tested with TypeScript 4 & Node.js 14.

Solution 4 - Javascript

yes! like above answers you need to add this..

const {
      performance,
      PerformanceObserver
    } = require('perf_hooks');

but you can run performance.now() inside your browser console or in your browser -> source tab -> snippet without adding above code.

you can read this to get to know more about this..

https://nodejs.org/api/perf_hooks.html#perf_hooks_performance_now

Solution 5 - Javascript

      try {
        var t0 =  Date.now()

        var res = someModel.find(someId, ctx.cookies);

        var t1 = Date.now()
        console.log("Call to find took " + (t1 - t0) + " milliseconds.");

        return res;
      } catch (err) {
        console.error(err);
        throw err;
      }
    }

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionElsbanView Question on Stackoverflow
Solution 1 - JavascriptgilmaticView Answer on Stackoverflow
Solution 2 - JavascriptLae KettavongView Answer on Stackoverflow
Solution 3 - JavascriptBenny NeugebauerView Answer on Stackoverflow
Solution 4 - JavascriptHeshanHHView Answer on Stackoverflow
Solution 5 - JavascriptTijani SyllaView Answer on Stackoverflow