Toggle navigation
MeasureThat.net
Create a benchmark
Tools
Feedback
FAQ
Register
Log In
ruse compiler factorial 002
(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); } factorial(NNN); } function tailcall() { function factorial (n, total) { return n === 0 ? total : factorial(n - 1, total * n); } 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):
I'll do my best to provide an answer! Given the provided code and benchmark results, I'll attempt to analyze the performance differences between the various test cases. **Code Analysis** The code appears to be a JavaScript implementation of a recursive function using a trampoline technique. The `program` function seems to be responsible for creating a new scope and calling the `output` function with an anonymous function as its argument. This anonymous function, in turn, calls the original recursive function (`v`) with the `k` variable as its argument. **Benchmark Results** The benchmark results show the execution times per second for each test case: | Test Name | Execution Time (s/s) | | --- | --- | | tailcall | 229304.625 | | vanilla | 227918.3125 | | v1 use strict | 2816.37939453125 | | v1 | 2754.1083984375 | | v0 | 2379.132080078125 | **Observations** * The `tailcall` test case performs significantly better than the other tests, with an execution time of over 229 times higher per second. * The `vanilla` and `v1 use strict` tests are relatively close to each other, with a small difference in their execution times. **Conclusion** Based on the benchmark results, it appears that using tailcall optimization leads to significant performance improvements in this specific implementation. However, without more information about the specific requirements or constraints of the application, it's difficult to make a definitive recommendation for which test case to use. The `tailcall` test case seems to be the fastest, but its execution time is also the highest due to the recursive nature of the function. Please let me know if there's any further information or context that can help provide a more accurate answer!
Related benchmarks:
ruse compiler factorial 001
ruse compiler factorial 003
ruse compiler factorial 004
ruse compiler factorial 010
Comments
Confirm delete:
Do you really want to delete benchmark?