diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/test/bench/shootout-mandelbrot.rs | 206 |
1 files changed, 103 insertions, 103 deletions
diff --git a/src/test/bench/shootout-mandelbrot.rs b/src/test/bench/shootout-mandelbrot.rs index 2fab8685c2c..31070895521 100644 --- a/src/test/bench/shootout-mandelbrot.rs +++ b/src/test/bench/shootout-mandelbrot.rs @@ -1,5 +1,6 @@ // based on: -// http://shootout.alioth.debian.org/u64q/program.php?test=mandelbrot&lang=python3&id=2 +// http://shootout.alioth.debian.org/ +// u64q/program.php?test=mandelbrot&lang=python3&id=2 // // takes 2 optional numeric args: square image size and yield frequency // in the shootout, they use 16000 as image size @@ -14,130 +15,129 @@ type cmplx = {re: f64, im: f64}; type line = {i: uint, b: [u8]}; impl arith for cmplx { - fn *(x: cmplx) -> cmplx { - {re: self.re*x.re - self.im*x.im, im: self.re*x.im + self.im*x.re} - } + fn *(x: cmplx) -> cmplx { + {re: self.re*x.re - self.im*x.im, im: self.re*x.im + self.im*x.re} + } - fn +(x: cmplx) -> cmplx { - {re: self.re + x.re, im: self.im + x.im} - } + fn +(x: cmplx) -> cmplx { + {re: self.re + x.re, im: self.im + x.im} + } } pure fn cabs(x: cmplx) -> f64 { - x.re*x.re + x.im*x.im + x.re*x.re + x.im*x.im } fn mb(x: cmplx) -> bool { - let z = {re: 0., im: 0.}; - let i = 0; - let in = true; - while i < 50 { - z = z*z + x; - if cabs(z) >= 4. { - in = false; - break; - } - i += 1; - } - in + let z = {re: 0., im: 0.}; + let i = 0; + let in = true; + while i < 50 { + z = z*z + x; + if cabs(z) >= 4. { + in = false; + break; + } + i += 1; + } + in } fn fillbyte(x: cmplx, incr: f64) -> u8 { - let rv = 0_u8; - let i = 0_u8; - while i < 8_u8 { - let z = {re: x.re + (i as f64)*incr, im: x.im}; - if mb(z) { - rv += 1_u8 << (7_u8 - i); - } - i += 1_u8; - } - rv + let rv = 0_u8; + let i = 0_u8; + while i < 8_u8 { + let z = {re: x.re + (i as f64)*incr, im: x.im}; + if mb(z) { + rv += 1_u8 << (7_u8 - i); + } + i += 1_u8; + } + rv } fn chanmb(i: uint, size: uint, ch: comm::chan<line>) -> () { - let crv = []; - let incr = 2./(size as f64); - let y = incr*(i as f64) - 1.; - let xincr = 8.*incr; - uint::range(0_u, size/8_u) { - |j| - let x = {re: xincr*(j as f64) - 1.5, im: y}; - crv += [fillbyte(x, incr)]; - }; - comm::send(ch, {i:i, b:crv}); + let crv = []; + let incr = 2./(size as f64); + let y = incr*(i as f64) - 1.; + let xincr = 8.*incr; + uint::range(0_u, size/8_u) { + |j| + let x = {re: xincr*(j as f64) - 1.5, im: y}; + crv += [fillbyte(x, incr)]; + }; + comm::send(ch, {i:i, b:crv}); } fn writer(writech: comm::chan<comm::chan<line>>, size: uint) { - let p: comm::port<line> = comm::port(); - let ch = comm::chan(p); - comm::send(writech, ch); - let cout = std::io::stdout(); - cout.write_line("P4"); - cout.write_line(#fmt("%u %u", size, size)); - let lines = std::map::new_uint_hash(); - let done = 0_u; - let i = 0_u; - while i < size { - let aline = comm::recv(p); - if aline.i == done { - #debug("W %u", aline.i); - cout.write(aline.b); - done += 1_u; - let prev = done; - while prev <= i { - if lines.contains_key(prev) { - #debug("WS %u", prev); - cout.write(lines.get(prev)); - done += 1_u; - lines.remove(prev); - prev += 1_u; - } - else { - break - } - }; - - } - else { - #debug("S %u", aline.i); - lines.insert(aline.i, aline.b); - }; - i += 1_u; - } + let p: comm::port<line> = comm::port(); + let ch = comm::chan(p); + comm::send(writech, ch); + let cout = std::io::stdout(); + cout.write_line("P4"); + cout.write_line(#fmt("%u %u", size, size)); + let lines = std::map::new_uint_hash(); + let done = 0_u; + let i = 0_u; + while i < size { + let aline = comm::recv(p); + if aline.i == done { + #debug("W %u", aline.i); + cout.write(aline.b); + done += 1_u; + let prev = done; + while prev <= i { + if lines.contains_key(prev) { + #debug("WS %u", prev); + cout.write(lines.get(prev)); + done += 1_u; + lines.remove(prev); + prev += 1_u; + } + else { + break + } + }; + } + else { + #debug("S %u", aline.i); + lines.insert(aline.i, aline.b); + }; + i += 1_u; + } } fn main(argv: [str]) { - let size = if vec::len(argv) < 2_u { - 80u - } - else { - uint::from_str(argv[1]) - }; - let yieldevery = if vec::len(argv) < 3_u { - 10_u - } - else { - uint::from_str(argv[2]) - }; - let writep = comm::port(); - let writech = comm::chan(writep); - task::spawn { - || writer(writech, size); - }; - let ch = comm::recv(writep); - uint::range(0_u, size) { - |j| task::spawn { - || chanmb(j, size, ch); - }; - if j % yieldevery == 0_u { - #debug("Y %u", j); - task::yield(); - }; - }; + let size = if vec::len(argv) < 2_u { + 80u + } + else { + uint::from_str(argv[1]) + }; + let yieldevery = if vec::len(argv) < 3_u { + 10_u + } + else { + uint::from_str(argv[2]) + }; + let writep = comm::port(); + let writech = comm::chan(writep); + task::spawn { + || writer(writech, size); + }; + let ch = comm::recv(writep); + uint::range(0_u, size) { + |j| task::spawn { + || chanmb(j, size, ch); + }; + if j % yieldevery == 0_u { + #debug("Y %u", j); + task::yield(); + }; + }; } |
