Toggle navigation
MeasureThat.net
Create a benchmark
Tools
Feedback
FAQ
Register
Log In
Stern sequence4
(version: 0)
Comparing performance of:
tail-end recursion (ascending) vs iterative (descending) vs iterative (descending) #2 vs iterative (descending) #3 vs iterative (descending) #4
Created:
7 years ago
by:
Guest
Jump to the latest result
Script Preparation code:
/** * rational number of rank @i (using Stern diatonic sequence order) * @returns {Array} [num, den] * * non tail-end recursion version * O(log(n)) time * O(log(n)) space (heap) */ function sternQ(i) { if (i === 0) return [0,1]; let [n,d] = sternQ(i>>1); if (i&1) return [n+d,d]; else return [n,n+d]; } /** * rational number of rank @i (using Stern diatonic sequence order) * @returns {Array} - [num, den] * * non tail-end recursion version * O(log(n)) time * O(log(n)) space (if no tail calll elimination, O(1) otherwise) */ function sternR_rec(i, frac = {num:[1,0],den:[0,1]}){ if (i === 0) return [-frac.num[1],frac.num[0]]; else if (i&1) return sternR(i>>1, {num:[frac.num[0]-frac.den[0], frac.num[1]-frac.den[1]], den : frac.den}); else return sternR(i>>1, {num:frac.num, den : [frac.den[0]-frac.num[0], frac.den[1]-frac.num[1]]}); } /** * rational number of rank @i (using Stern diatonic sequence order) * @returns {Array} - [num, den] * * iterative version * O(log(n)) time * O(1) space */ function sternR(i){ let frac = {num:[1,0],den:[0,1]}; while (i !== 0){ if (i&1) // odd frac.num = [frac.num[0]-frac.den[0], frac.num[1]-frac.den[1]]; else // even frac.den = [frac.den[0]-frac.num[0], frac.den[1]-frac.num[1]]; i = i>>1; } return [-frac.num[1],frac.num[0]]; } /** * rational number of rank @i (using Stern diatonic sequence order) * @returns {Array} - [num, den] * * iterative version * O(log(n)) time * O(1) space */ function sternR2(i){ let q = [0,1]; if (i===0) return q; let l = 1+(Math.log2(i)>>0); let mask = 1 << (l-1); for (let k=l; k>0; k--){ if (i&mask) q[0] += q[1]; else q[1] += q[0]; i = i & (~mask); mask = mask >>1; } return q; } /** * rational number of rank @i (using Stern diatonic sequence order) * @returns {Array} - [num, den] * * iterative version * O(log(n)) time * O(1) space */ function sternR3(i){ let q = [0,1]; if (i===0) return q; let mask = 1 << (Math.log2(i)); while (mask) { if (i&mask) q[0] += q[1]; else q[1] += q[0]; i = i & (~mask); mask >>= 1; } return q; } /** * rational number of rank @i (using Stern diatonic sequence order) * @returns {Array} - [num, den] * * iterative version * O(log(n)) time * O(1) space */ function sternR4(i){ let q = [0,1]; let mask = 1; for (let j = i>>1; j; j >>=1) { mask <<= 1; } while (mask) { if (i&mask) q[0] += q[1]; else q[1] += q[0]; i = i & (~mask); mask = mask >>1; } return q; } /** * i-ranked term of Stern diatonic sequence */ function stern(i){ return sternR(i)[0]; //return sternQ(i)[0]; } var n = 6000;
Tests:
tail-end recursion (ascending)
sternR_rec(n);
iterative (descending)
sternR(n);
iterative (descending) #2
sternR2(n);
iterative (descending) #3
sternR3(n);
iterative (descending) #4
sternR4(n)
Rendered benchmark preparation results:
Suite status:
<idle, ready to run>
Run tests (5)
Previous results
Fork
Test case name
Result
tail-end recursion (ascending)
iterative (descending)
iterative (descending) #2
iterative (descending) #3
iterative (descending) #4
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):
It looks like you're analyzing benchmark results for an algorithm implemented in JavaScript. The provided data seems to be in a format used by the Benchmark.js library, which is commonly used for browser benchmarking. Here's a summary of the analysis: 1. **Benchmark definitions**: The benchmark definitions are functions that calculate the rank of a term in Stern diatonic sequence: * `sternR_rec(n)` (tail-end recursion with ascending order) * `sternR(n)` (iterative version with descending order, denoted by #2, #3, and #4 suffixes) 2. **Test cases**: There are 6 test cases: + `tail-end recursion (ascending)` + `iterative (descending) #3` + `iterative (descending) #4` + `iterative (descending) #2` + `iterative (descending)` (without suffix) + `iterative (descending) #1` (missing in the provided data) 3. **Benchmark results**: The benchmark results are stored in an array of objects, each containing: * `RawUAString`: The raw UA string from the browser * `Browser`: The browser version used for testing * `DevicePlatform`: The device platform used for testing (Desktop in this case) * `OperatingSystem`: The operating system used for testing (Mac OS X 10.13 in this case) * `ExecutionsPerSecond`: The number of executions per second performed by the browser * `TestName`: The name of the test case Based on these results, it appears that the iterative version of the algorithm (`sternR(n)`) is generally faster than the tail-end recursion version (`sternR_rec(n)`). The `#2`, `#3`, and `#4` suffixes seem to refer to different versions of the iterative algorithm.
Related benchmarks:
Stern sequence2
Stern sequence3
Stern sequence6
Stern sequence7
Comments
Confirm delete:
Do you really want to delete benchmark?