const { PerformanceObserver, performance } = require("node:perf_hooks");
const obs = new PerformanceObserver((items) => {
const firstCall = items.getEntries()[0].duration.toFixed(4);
const memoCalls = items.getEntries()[1].duration.toFixed(4);
const efficiency = (firstCall / memoCalls) * 50;
printDivider();
console.log(`Duration of 1, un-memoized call:\n\t${firstCall}ms`);
printDivider();
console.log(`Duration of 50 memoized calls:\n\t${memoCalls}ms`);
printDivider();
console.log(`Estimated Efficiency Increase: ${efficiency.toFixed(0)}%`);
performance.clearMarks();
});
obs.observe({ type: "measure" });
const fibonacci = (pos) => {
if (pos < 2) return pos;
return fibonacci(pos - 1) + fibonacci(pos - 2);
};
const memoize = (fn) => {
const cache = {};
return (...args) => {
if (args.toString() in cache) {
return cache[args.toString()];
}
const result = fn(...args);
cache[args.toString()] = result;
return result;
};
};
const init = async () => {
const memoizedFibonacci = memoize(fibonacci);
performance.mark("A");
memoizedFibonacci(40);
performance.mark("B");
performance.measure("fibonacci", "A", "B");
performance.mark("C");
let i = 0;
while (i < 50) {
memoizedFibonacci(40);
i++;
}
performance.mark("D");
performance.measure("fibonacci", "C", "D");
};
init();
function printDivider() {
console.log(`=============================================`);
}