// examples/fib_iter // BEGIN mycpp output #include "gc_heap.h" using gc_heap::Alloc; using gc_heap::kZeroMask; using gc_heap::StackRoots; #include "my_runtime.h" #include "mylib2.h" using gc_heap::NewStr; using gc_heap::NewList; using gc_heap::NewDict; GLOBAL_STR(str0, "fib_iter(%d) = %d"); GLOBAL_STR(str1, "fib_iter(%d) = %d"); GLOBAL_STR(str2, "Ran %d iterations of fib_iter"); namespace fib_iter { // forward declare } // forward declare namespace fib_iter namespace fib_iter { // declare int fib_iter(int n); void run_tests(); void run_benchmarks(); inline Str* fmt0(int a0, int a1) { gBuf.reset(); gBuf.write_const("fib_iter(", 9); gBuf.format_d(a0); gBuf.write_const(") = ", 4); gBuf.format_d(a1); return gBuf.getvalue(); } inline Str* fmt1(int a0, int a1) { gBuf.reset(); gBuf.write_const("fib_iter(", 9); gBuf.format_d(a0); gBuf.write_const(") = ", 4); gBuf.format_d(a1); return gBuf.getvalue(); } inline Str* fmt2(int a0) { gBuf.reset(); gBuf.write_const("Ran ", 4); gBuf.format_d(a0); gBuf.write_const(" iterations of fib_iter", 23); return gBuf.getvalue(); } } // declare namespace fib_iter namespace fib_iter { // define int fib_iter(int n) { int a; int b; int i; int tmp; a = 0; b = 1; i = 0; while (i < n) { tmp = (a + b); a = b; b = tmp; i += 1; } return b; } void run_tests() { int x; int result; x = 33; result = fib_iter(x); println_stderr(fmt0(x, result)); } void run_benchmarks() { int n; int x; int result; int i; n = 500000; x = 33; result = -1; i = 0; while (i < n) { result = fib_iter(x); i += 1; } println_stderr(fmt1(x, result)); println_stderr(fmt2(n)); } } // define namespace fib_iter int main(int argc, char **argv) { // gc_heap::gHeap.Init(512); gc_heap::gHeap.Init(128 << 10); // 128 KiB; doubling in size // gc_heap::gHeap.Init(400 << 20); // 400 MiB to avoid garbage collection if (getenv("BENCHMARK")) { fprintf(stderr, "Benchmarking...\n"); fib_iter::run_benchmarks(); } else { fib_iter::run_tests(); } }