More perf tweaks (issue #2719)
This commit is contained in:
parent
51468b65a4
commit
a08281616f
6 changed files with 70 additions and 21 deletions
|
@ -161,7 +161,6 @@ impl extensions<A> for dvec<A> {
|
||||||
vec::push(self.data, t);
|
vec::push(self.data, t);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#[doc = "Remove and return the first element"]
|
#[doc = "Remove and return the first element"]
|
||||||
fn shift() -> A {
|
fn shift() -> A {
|
||||||
self.borrow { |v|
|
self.borrow { |v|
|
||||||
|
|
|
@ -52,7 +52,7 @@ impl reader_util for reader {
|
||||||
i += 1u;
|
i += 1u;
|
||||||
assert (w > 0u);
|
assert (w > 0u);
|
||||||
if w == 1u {
|
if w == 1u {
|
||||||
chars += [ b0 as char ]/~;
|
vec::push(chars, b0 as char );
|
||||||
cont;
|
cont;
|
||||||
}
|
}
|
||||||
// can't satisfy this char with the existing data
|
// can't satisfy this char with the existing data
|
||||||
|
@ -71,7 +71,7 @@ impl reader_util for reader {
|
||||||
// See str::char_at
|
// See str::char_at
|
||||||
val += ((b0 << ((w + 1u) as u8)) as uint)
|
val += ((b0 << ((w + 1u) as u8)) as uint)
|
||||||
<< (w - 1u) * 6u - w - 1u;
|
<< (w - 1u) * 6u - w - 1u;
|
||||||
chars += [ val as char ]/~;
|
vec::push(chars, val as char );
|
||||||
}
|
}
|
||||||
ret (i, 0u);
|
ret (i, 0u);
|
||||||
}
|
}
|
||||||
|
@ -86,7 +86,7 @@ impl reader_util for reader {
|
||||||
// we're split in a unicode char?
|
// we're split in a unicode char?
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
buf += data;
|
vec::push_all(buf, data);
|
||||||
let (offset, nbreq) = chars_from_buf(buf, chars);
|
let (offset, nbreq) = chars_from_buf(buf, chars);
|
||||||
let ncreq = n - vec::len(chars);
|
let ncreq = n - vec::len(chars);
|
||||||
// again we either know we need a certain number of bytes
|
// again we either know we need a certain number of bytes
|
||||||
|
@ -110,11 +110,11 @@ impl reader_util for reader {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn read_line() -> str {
|
fn read_line() -> str {
|
||||||
let mut buf: [u8]/~ = []/~;
|
let mut buf = []/~;
|
||||||
loop {
|
loop {
|
||||||
let ch = self.read_byte();
|
let ch = self.read_byte();
|
||||||
if ch == -1 || ch == 10 { break; }
|
if ch == -1 || ch == 10 { break; }
|
||||||
buf += [ch as u8]/~;
|
vec::push(buf, ch as u8);
|
||||||
}
|
}
|
||||||
str::from_bytes(buf)
|
str::from_bytes(buf)
|
||||||
}
|
}
|
||||||
|
@ -123,7 +123,7 @@ impl reader_util for reader {
|
||||||
let mut buf: [u8]/~ = []/~;
|
let mut buf: [u8]/~ = []/~;
|
||||||
loop {
|
loop {
|
||||||
let ch = self.read_byte();
|
let ch = self.read_byte();
|
||||||
if ch < 1 { break; } else { buf += [ch as u8]/~; }
|
if ch < 1 { break; } else { vec::push(buf, ch as u8); }
|
||||||
}
|
}
|
||||||
str::from_bytes(buf)
|
str::from_bytes(buf)
|
||||||
}
|
}
|
||||||
|
@ -158,7 +158,7 @@ impl reader_util for reader {
|
||||||
|
|
||||||
fn read_whole_stream() -> [u8]/~ {
|
fn read_whole_stream() -> [u8]/~ {
|
||||||
let mut buf: [u8]/~ = []/~;
|
let mut buf: [u8]/~ = []/~;
|
||||||
while !self.eof() { buf += self.read_bytes(2048u); }
|
while !self.eof() { vec::push_all(buf, self.read_bytes(2048u)); }
|
||||||
buf
|
buf
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -453,7 +453,7 @@ fn u64_to_le_bytes<T>(n: u64, size: uint, f: fn([u8]/&) -> T) -> T {
|
||||||
|
|
||||||
let mut bytes: [u8]/~ = []/~, i = size, n = n;
|
let mut bytes: [u8]/~ = []/~, i = size, n = n;
|
||||||
while i > 0u {
|
while i > 0u {
|
||||||
bytes += [(n & 255_u64) as u8]/~;
|
vec::push(bytes, (n & 255_u64) as u8);
|
||||||
n >>= 8_u64;
|
n >>= 8_u64;
|
||||||
i -= 1u;
|
i -= 1u;
|
||||||
}
|
}
|
||||||
|
@ -485,7 +485,7 @@ fn u64_to_be_bytes<T>(n: u64, size: uint, f: fn([u8]/&) -> T) -> T {
|
||||||
let mut i = size;
|
let mut i = size;
|
||||||
while i > 0u {
|
while i > 0u {
|
||||||
let shift = ((i - 1u) * 8u) as u64;
|
let shift = ((i - 1u) * 8u) as u64;
|
||||||
bytes += [(n >> shift) as u8]/~;
|
vec::push(bytes, (n >> shift) as u8);
|
||||||
i -= 1u;
|
i -= 1u;
|
||||||
}
|
}
|
||||||
f(bytes)
|
f(bytes)
|
||||||
|
|
|
@ -122,7 +122,7 @@ Convert a vector of bytes to a UTF-8 string
|
||||||
|
|
||||||
Fails if invalid UTF-8
|
Fails if invalid UTF-8
|
||||||
"]
|
"]
|
||||||
pure fn from_bytes(vv: [u8]/~) -> str {
|
pure fn from_bytes(+vv: [u8]/~) -> str {
|
||||||
assert is_utf8(vv);
|
assert is_utf8(vv);
|
||||||
ret unsafe { unsafe::from_bytes(vv) };
|
ret unsafe { unsafe::from_bytes(vv) };
|
||||||
}
|
}
|
||||||
|
@ -1750,9 +1750,9 @@ mod unsafe {
|
||||||
|
|
||||||
Does not verify that the vector contains valid UTF-8.
|
Does not verify that the vector contains valid UTF-8.
|
||||||
"]
|
"]
|
||||||
unsafe fn from_bytes(v: [const u8]/~) -> str {
|
unsafe fn from_bytes(+v: [const u8]/~) -> str {
|
||||||
unsafe {
|
unsafe {
|
||||||
let mut vcopy = ::unsafe::transmute(copy v);
|
let mut vcopy = ::unsafe::transmute(v);
|
||||||
vec::push(vcopy, 0u8);
|
vec::push(vcopy, 0u8);
|
||||||
::unsafe::transmute(vcopy)
|
::unsafe::transmute(vcopy)
|
||||||
}
|
}
|
||||||
|
|
|
@ -384,13 +384,12 @@ fn shift<T>(&v: [T]/~) -> T {
|
||||||
let mut rr;
|
let mut rr;
|
||||||
{
|
{
|
||||||
let vv = unsafe::to_ptr(vv);
|
let vv = unsafe::to_ptr(vv);
|
||||||
let mut r <- *vv;
|
rr <- *vv;
|
||||||
|
|
||||||
for uint::range(1u, ln) {|i|
|
for uint::range(1u, ln) {|i|
|
||||||
let r <- *ptr::offset(vv, i);
|
let r <- *ptr::offset(vv, i);
|
||||||
push(v, r);
|
push(v, r);
|
||||||
}
|
}
|
||||||
rr <- r;
|
|
||||||
}
|
}
|
||||||
unsafe::set_len(vv, 0u);
|
unsafe::set_len(vv, 0u);
|
||||||
|
|
||||||
|
|
48
src/test/bench/core-std.rs
Normal file
48
src/test/bench/core-std.rs
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
// Microbenchmarks for various functions in core and std
|
||||||
|
|
||||||
|
use std;
|
||||||
|
|
||||||
|
import std::time::precise_time_s;
|
||||||
|
|
||||||
|
import io::{reader, reader_util};
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
#macro[
|
||||||
|
[#bench[id],
|
||||||
|
run_test(#stringify(id), id)]
|
||||||
|
];
|
||||||
|
|
||||||
|
#bench[shift_push];
|
||||||
|
#bench[read_line];
|
||||||
|
}
|
||||||
|
|
||||||
|
fn run_test(name: str, test: fn()) {
|
||||||
|
let start = precise_time_s();
|
||||||
|
test();
|
||||||
|
let stop = precise_time_s();
|
||||||
|
|
||||||
|
io::println(#fmt("%s:\t\t%f ms", name, (stop - start) * 1000f));
|
||||||
|
}
|
||||||
|
|
||||||
|
fn shift_push() {
|
||||||
|
let mut v1 = vec::from_elem(30000, 1);
|
||||||
|
let mut v2 = []/~;
|
||||||
|
|
||||||
|
while v1.len() > 0 {
|
||||||
|
vec::push(v2, vec::shift(v1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn read_line() {
|
||||||
|
let path = path::connect(
|
||||||
|
#env("CFG_SRC_DIR"),
|
||||||
|
"src/test/bench/shootout-k-nucleotide.data"
|
||||||
|
);
|
||||||
|
|
||||||
|
for int::range(0, 3) {|_i|
|
||||||
|
let reader = result::get(io::file_reader(path));
|
||||||
|
while !reader.eof() {
|
||||||
|
reader.read_line();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -62,29 +62,32 @@ fn find(mm: hashmap<[u8]/~, uint>, key: str) -> uint {
|
||||||
}
|
}
|
||||||
|
|
||||||
// given a map, increment the counter for a key
|
// given a map, increment the counter for a key
|
||||||
fn update_freq(mm: hashmap<[u8]/~, uint>, key: [u8]/~) {
|
fn update_freq(mm: hashmap<[u8]/~, uint>, key: [u8]/&) {
|
||||||
alt mm.find(key) {
|
let key = vec::slice(key, 0, key.len());
|
||||||
|
alt mm.find(key) {
|
||||||
option::none { mm.insert(key, 1u ); }
|
option::none { mm.insert(key, 1u ); }
|
||||||
option::some(val) { mm.insert(key, 1u + val); }
|
option::some(val) { mm.insert(key, 1u + val); }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// given a [u8]/~, for each window call a function
|
// given a [u8]/~, for each window call a function
|
||||||
// i.e., for "hello" and windows of size four,
|
// i.e., for "hello" and windows of size four,
|
||||||
// run it("hell") and it("ello"), then return "llo"
|
// run it("hell") and it("ello"), then return "llo"
|
||||||
fn windows_with_carry(bb: [const u8]/~, nn: uint, it: fn(window: [u8]/~)) -> [u8]/~ {
|
fn windows_with_carry(bb: [const u8]/~, nn: uint,
|
||||||
|
it: fn(window: [u8]/&)) -> [u8]/~ {
|
||||||
let mut ii = 0u;
|
let mut ii = 0u;
|
||||||
|
|
||||||
let len = vec::len(bb);
|
let len = vec::len(bb);
|
||||||
while ii < len - (nn - 1u) {
|
while ii < len - (nn - 1u) {
|
||||||
it(vec::slice(bb, ii, ii+nn));
|
it(vec::view(bb, ii, ii+nn));
|
||||||
ii += 1u;
|
ii += 1u;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret vec::slice(bb, len - (nn - 1u), len);
|
ret vec::slice(bb, len - (nn - 1u), len);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn make_sequence_processor(sz: uint, from_parent: comm::port<[u8]/~>, to_parent: comm::chan<str>) {
|
fn make_sequence_processor(sz: uint, from_parent: comm::port<[u8]/~>,
|
||||||
|
to_parent: comm::chan<str>) {
|
||||||
|
|
||||||
let freqs: hashmap<[u8]/~, uint> = map::bytes_hash();
|
let freqs: hashmap<[u8]/~, uint> = map::bytes_hash();
|
||||||
let mut carry: [u8]/~ = []/~;
|
let mut carry: [u8]/~ = []/~;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue