Skip to content

Instantly share code, notes, and snippets.

@Xananax
Last active November 5, 2015 12:20
Show Gist options
  • Select an option

  • Save Xananax/0e74170429fa6ff3f8af to your computer and use it in GitHub Desktop.

Select an option

Save Xananax/0e74170429fa6ff3f8af to your computer and use it in GitHub Desktop.
Simple performance test of sum-like functions

for 4000 iterations, on node:

  • sumHaskellLike: 39.031886
  • sumJSFunctional: 15.758613999999994
  • sumJSLoop: 3.674158999999996
// accurate time resolution
// stolen from https://github.com/myrne/performance-now
const now = (function(){
if((typeof performance !== "undefined" && performance !== null) && performance.now) {
return function nowPerformance() {
return performance.now();
};
}
if ((typeof process !== "undefined" && process !== null) && process.hrtime) {
let hrtime = process.hrtime;
let loadTime = getNanoSeconds();
function getNanoSeconds(){
var hr;
hr = hrtime();
return hr[0] * 1e9 + hr[1];
};
return function nowHrTime(){
return (getNanoSeconds() - loadTime) / 1e6;
};
}
if (Date.now) {
let loadTime = Date.now();
return function nowDate(){
return Date.now() - loadTime;
};
}
let loadTime = new Date().getTime();
return function nowDefault() {
return new Date().getTime() - loadTime;
};
})();
function isEmpty(xs) {
return xs.length === 0;
}
function sumHaskellLike(x, ...xs) {
return isEmpty(xs) ? x : x + sumHaskellLike(...xs);
}
function sumJSFunctional(...xs) {
return xs.reduce((x, total) => x + total);
}
function sumJSLoop(...xs){
var sum = 0, i = 0, l = xs.length;
for(i;i<l;i++){
sum+=xs[i];
}
return sum;
}
function test(iterations,fn,...n){
let t1 = now();
let result;
while(iterations--){
result = fn(...n);
}
if(result!=210){throw new Error('result is incorrect');}
let t2 = now();
console.log(fn.name+':',(t2-t1));
}
const iterations = 4000;
test(iterations,sumHaskellLike,1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20);
test(iterations,sumJSFunctional,1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20);
test(iterations,sumJSLoop,1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20);
"use strict";
//transpiled Testing_Sum.js
var now = (function () {
if (typeof performance !== "undefined" && performance !== null && performance.now) {
return function nowPerformance() {
return performance.now();
};
}
if (typeof process !== "undefined" && process !== null && process.hrtime) {
var _ret = (function () {
var getNanoSeconds = function () {
var hr;
hr = hrtime();
return hr[0] * 1000000000 + hr[1];
};
var hrtime = process.hrtime;
var loadTime = getNanoSeconds();
;
return {
v: function nowHrTime() {
return (getNanoSeconds() - loadTime) / 1000000;
}
};
})();
if (typeof _ret === "object") return _ret.v;
}
if (Date.now) {
var _ret2 = (function () {
var loadTime = Date.now();
return {
v: function nowDate() {
return Date.now() - loadTime;
}
};
})();
if (typeof _ret2 === "object") return _ret2.v;
}
var loadTime = new Date().getTime();
return function nowDefault() {
return new Date().getTime() - loadTime;
};
})();
function isEmpty(xs) {
return xs.length === 0;
}
function sumHaskellLike(x) {
for (var _len = arguments.length, xs = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
xs[_key - 1] = arguments[_key];
}
return isEmpty(xs) ? x : x + sumHaskellLike.apply(undefined, xs);
}
function sumJSFunctional() {
for (var _len2 = arguments.length, xs = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
xs[_key2] = arguments[_key2];
}
return xs.reduce(function (x, total) {
return x + total;
});
}
function sumJSLoop() {
for (var _len3 = arguments.length, xs = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
xs[_key3] = arguments[_key3];
}
var sum = 0,
i = 0,
l = xs.length;
for (i; i < l; i++) {
sum += xs[i];
}
return sum;
}
function test(iterations, fn) {
for (var _len4 = arguments.length, n = Array(_len4 > 2 ? _len4 - 2 : 0), _key4 = 2; _key4 < _len4; _key4++) {
n[_key4 - 2] = arguments[_key4];
}
var t1 = now();
var result = undefined;
while (iterations--) {
result = fn.apply(undefined, n);
}
if (result != 210) {
throw new Error("result is incorrect");
}
var t2 = now();
console.log(fn.name + ":", t2 - t1);
}
var iterations = 4000;
test(iterations, sumHaskellLike, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20);
test(iterations, sumJSFunctional, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20);
test(iterations, sumJSLoop, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment