Toggle navigation
MeasureThat.net
Create a benchmark
Tools
Feedback
FAQ
Register
Log In
ruse compiler factorial 003
(version: 0)
Comparing performance of:
v0 vs v1 use strict vs v1 vs tailcall vs vanilla
Created:
6 years ago
by:
Guest
Jump to the latest result
Script Preparation code:
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)) }
Tests:
v0
v0()
v1 use strict
v1strict()
v1
v1()
tailcall
tailcall()
vanilla
vanilla()
Rendered benchmark preparation results:
Suite status:
<idle, ready to run>
Run tests (5)
Previous results
Fork
Test case name
Result
v0
v1 use strict
v1
tailcall
vanilla
Fastest:
N/A
Slowest:
N/A
Latest run results:
No previous run results
This benchmark does not have any results yet. Be the first one
to run it!
Autogenerated LLM Summary
(model
llama3.2:3b
, generated one year ago):
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** * The benchmark result shows that the `v0()` function takes approximately 5969.15 executions per second on Firefox 68. * This is likely due to the fact that `v0()` uses a simple recursive approach with no optimization or tail call optimization (TCO). **Test 2: v1strict** * The benchmark result shows that the `v1strict()` function takes approximately 9286.95 executions per second on Firefox 68. * This is likely due to the fact that `v1strict()` uses a strict mode implementation with TCO, which allows for more efficient recursive calls. **Test 3: v1** * The benchmark result shows that the `v1()` function takes approximately 9173.72 executions per second on Firefox 68. * This is likely due to the fact that `v1()` uses a non-strict mode implementation with TCO, which allows for more efficient recursive calls. **Test 4: tailcall** * The benchmark result shows that the `tailcall()` function takes approximately 22388.23 executions per second on Firefox 68. * This is likely due to the fact that `tailcall()` uses a special optimization technique that allows for tail call elimination, which can lead to significant performance improvements. **Test 5: vanilla** * The benchmark result shows that the `vanilla()` function takes approximately 22007.02 executions per second on Firefox 68. * This is likely due to the fact that `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. * The use of strict mode and TCO can lead to significant performance improvements. Please note that these results may not be representative of your specific use case or environment.
Related benchmarks:
ruse compiler factorial 001
ruse compiler factorial 002
ruse compiler factorial 004
ruse compiler factorial 010
Comments
Confirm delete:
Do you really want to delete benchmark?