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))
}
v0()
v1strict()
v1()
tailcall()
vanilla()
--enable-precise-memory-info
flag.
Test case name | Result |
---|---|
v0 | |
v1 use strict | |
v1 | |
tailcall | |
vanilla |
Test name | Executions per second |
---|---|
v0 | 5969.1 Ops/sec |
v1 use strict | 9287.0 Ops/sec |
v1 | 9173.7 Ops/sec |
tailcall | 22388.2 Ops/sec |
vanilla | 22007.0 Ops/sec |
The code you provided is a JavaScript benchmarking test, and it appears to be testing the performance of two different implementations of the factorial function: vanilla()
and tailcall()
. The test also includes benchmarks for four other functions: v0()
, v1strict()
, v1()
, and tailcall()
.
To answer your question, I will provide an analysis of the benchmark results.
Test 1: v0
v0()
function takes approximately 5969.15 executions per second on Firefox 68.v0()
uses a simple recursive approach with no optimization or tail call optimization (TCO).Test 2: v1strict
v1strict()
function takes approximately 9286.95 executions per second on Firefox 68.v1strict()
uses a strict mode implementation with TCO, which allows for more efficient recursive calls.Test 3: v1
v1()
function takes approximately 9173.72 executions per second on Firefox 68.v1()
uses a non-strict mode implementation with TCO, which allows for more efficient recursive calls.Test 4: tailcall
tailcall()
function takes approximately 22388.23 executions per second on Firefox 68.tailcall()
uses a special optimization technique that allows for tail call elimination, which can lead to significant performance improvements.Test 5: vanilla
vanilla()
function takes approximately 22007.02 executions per second on Firefox 68.vanilla()
uses a standard recursive implementation without any optimizations or TCO.In summary, the results suggest that:
tailcall()
and v1strict()
are the fastest implementations, followed by vanilla()
.v1
and v0()
have similar performance characteristics, with v1()
being slightly faster.Please note that these results may not be representative of your specific use case or environment.