NNN = 100
function v0 () {
function voidf(k) { return k(undefined); };
function pk(x, y) {
console.log("pk", x, y);
return voidf;
}
function trampoline(thunk) {
// console.log('trampoline start', thunk)
while (thunk && typeof thunk === "function") {
// console.log('boing');
thunk = thunk();
}
return thunk
}
function add(a, b) {
return a + b;
}
function times(a, b) {
return a * b;
}
let program =
(function( kxx ) { return (function( ) { return (function( k ) { return k ( (function( kk, factorial_0 ) { return (function( ) { return (function( kxx ) { return (function( ) { return (function( k ) { return k ( (function( kk, t_3 ) { return (function( ) { return (function( kxx ) { return (function( ) { return factorial_0 ( (function( v ) { return (function( ) { return (function( k ) { return k ( NNN ) ;}) ( (function( v0 ) { return (function( ) { return (function( k ) { return k ( 1 ) ;}) ( (function( v1 ) { return (function( ) { return v ( kxx, (function( kv ) { return kv ( v0 ) ;}), (function( kv ) { return kv ( v1 ) ;}) ) ;}) ;}) ) ;}) ;}) ) ;}) ;}) ) ;}) ;}) ( kk ) ;}) ;}) ) ;}) ( (function( v ) { return (function( ) { return (function( k ) { return (function( ) { factorial_0 = (function( k ) { return k ( (function( kk, n_1, total_2 ) { return (function( ) { return (function( k ) { return (function( kpr ) { return (function( ) { return n_1 ( (function( v0 ) { return (function( ) { return (function( k ) { return k ( 0 ) ;}) ( (function( v1 ) { return kpr ( v0 === v1 ) ;}) ) ;}) ;}) ) ;}) ;}) ( (function( kif ) { return /* if */ kif ? (function( ) { return total_2 ( k ) ;}) : (function( ) { return (function( kxx ) { return (function( ) { return factorial_0 ( (function( v ) { return (function( ) { return (function( kpr ) { return (function( ) { return n_1 ( (function( v0 ) { return (function( ) { return (function( k ) { return k ( -1 ) ;}) ( (function( v1 ) { return kpr ( add ( v0, v1 ) ) ;}) ) ;}) ;}) ) ;}) ;}) ( (function( v0 ) { return (function( ) { return (function( kpr ) { return (function( ) { return n_1 ( (function( v0 ) { return (function( ) { return total_2 ( (function( v1 ) { return kpr ( times ( v0, v1 ) ) ;}) ) ;}) ;}) ) ;}) ;}) ( (function( v1 ) { return (function( ) { return v ( kxx, (function( kv ) { return kv ( v0 ) ;}), (function( kv ) { return kv ( v1 ) ;}) ) ;}) ;}) ) ;}) ;}) ) ;}) ;}) ) ;}) ;}) ( k ) ;}) ;}) ) ;}) ( kk ) ;}) ;}) ) ;}); return k ( voidf ) ;}) ;}) ( (function( v0 ) { return (function( ) { return v ( kxx, (function( kv ) { return kv ( v0 ) ;}) ) ;}) ;}) ) ;}) ;}) ) ;}) ;}) ( kk ) ;}) ;}) ) ;}) ( (function( v ) { return (function( ) { return voidf ( (function( v0 ) { return (function( ) { return v ( kxx, (function( kv ) { return kv ( v0 ) ;}) ) ;}) ;}) ) ;}) ;}) ) ;}) ;})
;
function output(x) {
pk('output', x);
return function() {};
}
trampoline(function() {return program (output);});
}
function v1strict() {
"use strict";
function voidf(k) { return k(undefined); };
function pk() {
console.log.apply(console, arguments);
}
function trampoline(thunk) {
// console.log('trampoline start', thunk)
while (thunk && typeof thunk === "function") {
// console.log('boing');
thunk = thunk();
}
return thunk
}
function prepend(v, a) {
// a.slice().unshift(0); // avoid mutation with copy
a.unshift(v);
return a;
}
function apply(func, args) {
return func.apply(this, args);
}
function add(a, b) {
return a + b;
}
function times(a, b) {
return a * b;
}
let program =
(function( k ) { return (function( k ) { return k ( (function( k, fact_0 ) { return (function( k ) { return (function( k ) { return k ( (function( k, t_3 ) { return (function( k ) { return fact_0 ( (function( v ) { return (function( k ) { return k ( NNN ) ;}) ( (function( v0 ) { return (function( k ) { return k ( 1 ) ;}) ( (function( v1 ) { return (function( ) { return v ( k, (function( kv ) { return kv ( v0 ) ;}), (function( kv ) { return kv ( v1 ) ;}) ) ;}) ;}) ) ;}) ) ;}) ) ;}) ( k ) ;}) ) ;}) ( (function( v ) { return (function( k ) { return (function( ) { fact_0 = (function( k ) { return k ( (function( k, n_1, total_2 ) { return (function( k ) { return (function( k ) { return n_1 ( (function( v0 ) { return (function( k ) { return k ( 0 ) ;}) ( (function( v1 ) { return k ( v0 === v1 ) ;}) ) ;}) ) ;}) ( (function( kif ) { return /* if */ kif ? (function( ) { return total_2 ( k ) ;}) : (function( ) { return (function( k ) { return fact_0 ( (function( v ) { return (function( k ) { return n_1 ( (function( v0 ) { return (function( k ) { return k ( -1 ) ;}) ( (function( v1 ) { return k ( add ( v0, v1 ) ) ;}) ) ;}) ) ;}) ( (function( v0 ) { return (function( k ) { return total_2 ( (function( v0 ) { return n_1 ( (function( v1 ) { return k ( times ( v0, v1 ) ) ;}) ) ;}) ) ;}) ( (function( v1 ) { return (function( ) { return v ( k, (function( kv ) { return kv ( v0 ) ;}), (function( kv ) { return kv ( v1 ) ;}) ) ;}) ;}) ) ;}) ) ;}) ) ;}) ( k ) ;}) ;}) ) ;}) ( k ) ;}) ) ;}); return k ( voidf ) ;}) ;}) ( (function( v0 ) { return (function( ) { return v ( k, (function( kv ) { return kv ( v0 ) ;}) ) ;}) ;}) ) ;}) ) ;}) ( k ) ;}) ) ;}) ( (function( v ) { return voidf ( (function( v0 ) { return (function( ) { return v ( k, (function( kv ) { return kv ( v0 ) ;}) ) ;}) ;}) ) ;}) ) ;})
;
function output(x) {
pk('output', x);
return function() {};
}
trampoline(function() {return program (output);});
}
function v1() {
function voidf(k) { return k(undefined); };
function pk() {
console.log.apply(console, arguments);
}
function trampoline(thunk) {
// console.log('trampoline start', thunk)
while (thunk && typeof thunk === "function") {
// console.log('boing');
thunk = thunk();
}
return thunk
}
function prepend(v, a) {
// a.slice().unshift(0); // avoid mutation with copy
a.unshift(v);
return a;
}
function apply(func, args) {
return func.apply(this, args);
}
function add(a, b) {
return a + b;
}
function times(a, b) {
return a * b;
}
let program =
(function( k ) { return (function( k ) { return k ( (function( k, fact_0 ) { return (function( k ) { return (function( k ) { return k ( (function( k, t_3 ) { return (function( k ) { return fact_0 ( (function( v ) { return (function( k ) { return k ( NNN ) ;}) ( (function( v0 ) { return (function( k ) { return k ( 1 ) ;}) ( (function( v1 ) { return (function( ) { return v ( k, (function( kv ) { return kv ( v0 ) ;}), (function( kv ) { return kv ( v1 ) ;}) ) ;}) ;}) ) ;}) ) ;}) ) ;}) ( k ) ;}) ) ;}) ( (function( v ) { return (function( k ) { return (function( ) { fact_0 = (function( k ) { return k ( (function( k, n_1, total_2 ) { return (function( k ) { return (function( k ) { return n_1 ( (function( v0 ) { return (function( k ) { return k ( 0 ) ;}) ( (function( v1 ) { return k ( v0 === v1 ) ;}) ) ;}) ) ;}) ( (function( kif ) { return /* if */ kif ? (function( ) { return total_2 ( k ) ;}) : (function( ) { return (function( k ) { return fact_0 ( (function( v ) { return (function( k ) { return n_1 ( (function( v0 ) { return (function( k ) { return k ( -1 ) ;}) ( (function( v1 ) { return k ( add ( v0, v1 ) ) ;}) ) ;}) ) ;}) ( (function( v0 ) { return (function( k ) { return total_2 ( (function( v0 ) { return n_1 ( (function( v1 ) { return k ( times ( v0, v1 ) ) ;}) ) ;}) ) ;}) ( (function( v1 ) { return (function( ) { return v ( k, (function( kv ) { return kv ( v0 ) ;}), (function( kv ) { return kv ( v1 ) ;}) ) ;}) ;}) ) ;}) ) ;}) ) ;}) ( k ) ;}) ;}) ) ;}) ( k ) ;}) ) ;}); return k ( voidf ) ;}) ;}) ( (function( v0 ) { return (function( ) { return v ( k, (function( kv ) { return kv ( v0 ) ;}) ) ;}) ;}) ) ;}) ) ;}) ( k ) ;}) ) ;}) ( (function( v ) { return voidf ( (function( v0 ) { return (function( ) { return v ( k, (function( kv ) { return kv ( v0 ) ;}) ) ;}) ;}) ) ;}) ) ;})
;
function output(x) {
pk('output', x);
return function() {};
}
trampoline(function() {return program (output);});
}
function vanilla() {
function factorial (n) {
return n === 0 ? 1 : n * factorial(n -1);
}
console.log(factorial(NNN));
}
function tailcall() {
function factorial (n, total) {
return n === 0 ? total : factorial(n - 1, total * n);
}
console.log(factorial(NNN, 1))
}
function iterative() {
function sFact(num)
{
var rval=1;
for (var i = 2; i <= num; i++)
rval = rval * i;
return rval;
}
console.log(sFact(NNN));
}
v0()
v1strict()
v1()
tailcall()
vanilla()
iterative()
--enable-precise-memory-info
flag.
Test case name | Result |
---|---|
v0 | |
v1 use strict | |
v1 | |
tailcall | |
vanilla | |
iterative |
Test name | Executions per second |
---|---|
v0 | 8710.9 Ops/sec |
v1 use strict | 11384.3 Ops/sec |
v1 | 11377.7 Ops/sec |
tailcall | 50900.1 Ops/sec |
vanilla | 56608.2 Ops/sec |
iterative | 57978.7 Ops/sec |
Based on the provided benchmark results, I will analyze the performance of each test case and provide a general comparison.
Benchmark Results Analysis
Here are the results grouped by Test Name:
Comparison and Insights
Based on the results:
vanilla
test has a relatively high execution rate of 11377.673828125 seconds per second.v0
test has a lower execution rate compared to the recursive factorial
function.tailcall
test outperforms all other tests, likely due to its optimized implementation.v1 use strict
and v1
tests have close execution rates, with the latter being slightly faster.Conclusion
The results suggest that:
v0
) has a relatively low execution rate compared to other tests.Please note that these conclusions are based on the provided benchmark results and may not reflect the full picture of each test's performance characteristics or other factors affecting execution rates.