Iteration/Recursion/Trampolining

Benchmark created on


Setup

let target = 2000;
let expected = target * (target + 1) / 2;
function* range(n) {
	for (let i = 1; i <= n; i++) {
		yield i;
	}
}

function sumToImperative(n) {
	let result = 0;
	for (let i = 1; i <= n; i++) {
		result += i;
	}
	return result;
}

function sumToGenerator(n) {
	let result = 0;
	for (let i of range(n)) {
		result += i;
	}
	return result;
}

function sumToRecursive(n, sum = 0) {
	return n === 0 ? sum : sumToRecursive(n - 1, sum + n);
}

function sumToTrampoline(n) {
	function go(n, sum = 0) {
		return n === 0 ? sum : () => go(n - 1, sum + n);
	}
	let result = go(n);
	while (typeof result === 'function') {
		result = result();
	}
	return result;
}

function assert(cond) {
	if (!cond) {
		throw new Error('Bad math');
	}
}

Test runner

Ready to run.

Testing in
TestOps/sec
For Loop
assert(sumToImperative(target) === expected);
ready
Generator
assert(sumToGenerator(target) === expected);
ready
Recursive
assert(sumToRecursive(target) === expected);
ready
Trampoline
assert(sumToTrampoline(target) === expected);
ready

Revisions

You can edit these tests or add more tests to this page by appending /edit to the URL.