From 79ca673af79aecc3c63334dee593ded838007e11 Mon Sep 17 00:00:00 2001 From: Eric Holk Date: Fri, 8 Jul 2011 12:18:54 -0700 Subject: [PATCH] Adding more support for working with u64s. --- src/lib/std.rc | 1 + src/lib/u64.rs | 39 ++++++++++++++++++++++++++++++++ src/test/bench/shootout/pfib.rs | 13 +++++++---- src/test/bench/task-perf/pfib.rs | 8 ++++--- 4 files changed, 54 insertions(+), 7 deletions(-) create mode 100644 src/lib/u64.rs diff --git a/src/lib/std.rc b/src/lib/std.rc index 21fd2cbbbc6..20d3e3f071f 100644 --- a/src/lib/std.rc +++ b/src/lib/std.rc @@ -12,6 +12,7 @@ mod int; mod uint; mod u8; +mod u64; mod vec; mod ivec; mod str; diff --git a/src/lib/u64.rs b/src/lib/u64.rs new file mode 100644 index 00000000000..5bedd102c2a --- /dev/null +++ b/src/lib/u64.rs @@ -0,0 +1,39 @@ +fn to_str(u64 n, uint radix) -> str { + assert(0u < radix && radix <= 16u); + + auto r64 = radix as u64; + + fn digit(u64 n) -> str { + ret alt (n) { + case (0u64) { "0" } + case (1u64) { "1" } + case (2u64) { "2" } + case (3u64) { "3" } + case (4u64) { "4" } + case (5u64) { "5" } + case (6u64) { "6" } + case (7u64) { "7" } + case (8u64) { "8" } + case (9u64) { "9" } + case (10u64) { "a" } + case (11u64) { "b" } + case (12u64) { "c" } + case (13u64) { "d" } + case (14u64) { "e" } + case (15u64) { "f" } + case (_) { fail } + }; + } + + if n == 0u64 { ret "0"; } + + auto s = ""; + + while(n > 0u64) { + s = digit(n % r64) + s; + n /= r64; + } + ret s; +} + +fn str(u64 n) -> str { ret to_str(n, 10u); } diff --git a/src/test/bench/shootout/pfib.rs b/src/test/bench/shootout/pfib.rs index cbe0813efc4..c63b8ae3c08 100644 --- a/src/test/bench/shootout/pfib.rs +++ b/src/test/bench/shootout/pfib.rs @@ -55,10 +55,15 @@ fn main(vec[str] argv) { auto fibn = fib(n); auto stop = time::precise_time_ns(); - auto elapsed = (stop - start) as int; - auto us_task = elapsed / fibn / 1000; + assert(stop >= start); - log_err #fmt("Determined that fib(%d) = %d in %d ns (%d us / task)", - n, fibn, elapsed, us_task); + auto elapsed = stop - start; + auto us_task = elapsed / (fibn as u64) / (1000 as u64); + + log_err #fmt("Determined that fib(%d) = %d in %d%d ns (%d us / task)", + n, fibn, + (elapsed / (1000000 as u64)) as int, + (elapsed % (1000000 as u64)) as int, + us_task as int); } } diff --git a/src/test/bench/task-perf/pfib.rs b/src/test/bench/task-perf/pfib.rs index c1069513980..64ab42147e8 100644 --- a/src/test/bench/task-perf/pfib.rs +++ b/src/test/bench/task-perf/pfib.rs @@ -19,6 +19,7 @@ import std::int::range; import std::io; import std::getopts; import std::task; +import std::u64; fn recv[T](&port[T] p) -> T { let T x; @@ -106,16 +107,17 @@ fn main(vec[str] argv) { auto num_trials = 10; auto out = io::stdout(); - + for each(int n in range(1, max + 1)) { for each(int i in range(0, num_trials)) { auto start = time::precise_time_ns(); auto fibn = fib(n); auto stop = time::precise_time_ns(); - auto elapsed = (stop - start) as int; + auto elapsed = stop - start; - out.write_line(#fmt("%d\t%d\t%d", n, fibn, elapsed)); + out.write_line(#fmt("%d\t%d\t%s", n, fibn, + u64::str(elapsed))); } } }