Javascript factorial - performance considerations

I was playing with writing the best and shortest factorial function in javascript. Here are some results for you: (results from Mac OS running Chrome Version 55.0.2883.95 in Developer Console)


f = n => n?n*f(n-1):1;


console.time('factorial recursive'); f(9999); console.timeEnd('factorial recursive');

VM272:1 factorial recursive: 0.733ms

However, a purely recursive function quickly runs into memory issues:


console.time('factorial recursive'); f(9999999); console.timeEnd('factorial recursive');

VM102:1 Uncaught RangeError: Maximum call stack size exceeded

A better version is to use lodash reduce:


f = n => n ? _(_.range(1,n+1)).reduce((p,i) => p*i) : 1;



console.time('factorial reduce'); f(9999); console.timeEnd('factorial reduce');

VM301:1 factorial reduce: 1.724ms



console.time('factorial reduce large'); f(999999); console.timeEnd('factorial reduce large');

VM332:1 factorial reduce large: 27.457ms

And if you use factorials a lot in your code, just memoize it:


var f1 = [];

factorial = n => f1[n] ? f1[n] : n ? f1[n] = factorial(n-1) * n : 1;


console.time('factorial memoize ES6 prepare'); factorial(9999); console.timeEnd('factorial memoize ES6 prepare');

VM537:1 factorial memoize ES6 prepare: 1.739ms

console.time('factorial memoize ES6 ready'); factorial(9812); console.timeEnd('factorial memoize ES6 ready');

VM539:1 factorial memoize ES6 ready: 0.297ms

console.time('factorial memoize ES6 ready'); factorial(7628); console.timeEnd('factorial memoize ES6 ready');

VM541:1 factorial memoize ES6 ready: 0.038ms

console.time('factorial memoize ES6 ready'); factorial(7183); console.timeEnd('factorial memoize ES6 ready');

VM543:1 factorial memoize ES6 ready: 0.018ms

Comments

Popular posts from this blog

Manual pages optimized for search as well as for reading

VIM changing file SE context