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)
However, a purely recursive function quickly runs into memory issues:
A better version is to use lodash reduce:
And if you use factorials a lot in your code, just memoize it:
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
Post a Comment