From ef1b25c22437961bbc04384826e619fae4723977 Mon Sep 17 00:00:00 2001 From: Arcterus Date: Fri, 11 Jul 2014 11:09:43 -0700 Subject: [PATCH 1/2] cksum: improve performance slightly --- cksum/cksum.rs | 35 +++++++++++++++++------------------ 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/cksum/cksum.rs b/cksum/cksum.rs index 8c0478321..0e855c8aa 100644 --- a/cksum/cksum.rs +++ b/cksum/cksum.rs @@ -41,36 +41,35 @@ fn crc_final(mut crc: u32, mut length: uint) -> u32 { !crc } +#[inline] fn cksum(fname: &str) -> IoResult<(u32, uint)> { let mut crc = 0u32; let mut size = 0u; - let mut rd = try!(open_file(fname)); + let mut stdin_buf; + let mut file_buf; + let rd = match fname { + "-" => { + stdin_buf = stdin_raw(); + &mut stdin_buf as &mut Reader + } + _ => { + file_buf = try!(File::open(&Path::new(fname))); + &mut file_buf as &mut Reader + } + }; + let mut bytes: [u8, ..1024 * 1024] = unsafe { mem::uninitialized() }; loop { match rd.read(bytes) { Ok(num_bytes) => { - for &b in bytes.iter().take(num_bytes) { + for &b in bytes.slice_to(num_bytes).iter() { crc = crc_update(crc, b); } size += num_bytes; } - Err(err) => { - return match err { - IoError{kind: k, ..} if k == EndOfFile => Ok((crc_final(crc, size), size)), - _ => Err(err), - } - } - } - } -} - -fn open_file(name: &str) -> IoResult> { - match name { - "-" => Ok(box stdin_raw() as Box), - _ => { - let f = try!(File::open(&Path::new(name))); - Ok(box f as Box) + Err(IoError { kind: EndOfFile, .. }) => return Ok((crc_final(crc, size), size)), + Err(err) => return Err(err) } } } From dc6060a85b578368abdcad2caaf149af8904b620 Mon Sep 17 00:00:00 2001 From: Arcterus Date: Fri, 11 Jul 2014 20:39:15 -0700 Subject: [PATCH 2/2] base64: slightly improve decoding performance speed --- base64/base64.rs | 54 +++++++++++++++++++++++++++++------------------- 1 file changed, 33 insertions(+), 21 deletions(-) diff --git a/base64/base64.rs b/base64/base64.rs index 36e9ec796..12a5c21cb 100644 --- a/base64/base64.rs +++ b/base64/base64.rs @@ -17,8 +17,8 @@ extern crate getopts; extern crate libc; #[phase(plugin, link)] extern crate log; -use std::io::{println, File, stdin, stdout}; -use std::str; +use std::io::{println, File, stdout}; +use std::io::stdio::stdin_raw; use getopts::{ getopts, @@ -74,11 +74,15 @@ pub fn uumain(args: Vec) -> int { }, None => 76 }; - let mut input = if matches.free.is_empty() || matches.free.get(0).as_slice() == "-" { - box stdin() as Box + let mut stdin_buf; + let mut file_buf; + let input = if matches.free.is_empty() || matches.free.get(0).as_slice() == "-" { + stdin_buf = stdin_raw(); + &mut stdin_buf as &mut Reader } else { - let path = Path::new(matches.free.get(0).clone()); - box File::open(&path) as Box + let path = Path::new(matches.free.get(0).as_slice()); + file_buf = File::open(&path); + &mut file_buf as &mut Reader }; match mode { @@ -94,33 +98,42 @@ pub fn uumain(args: Vec) -> int { fn decode(input: &mut Reader, ignore_garbage: bool) { let mut to_decode = match input.read_to_string() { Ok(m) => m, - Err(f) => fail!(f.to_string()) + Err(f) => fail!(f) }; - to_decode = str::replace(to_decode.as_slice(), "\n", ""); + let slice = + if ignore_garbage { + to_decode.as_slice() + .trim_chars(|c: char| { + let num = match c.to_ascii_opt() { + Some(ascii) => ascii.to_byte(), + None => return false + }; + !(num >= 'a' as u8 && num <= 'z' as u8 || + num >= 'A' as u8 && num <= 'Z' as u8 || + num >= '0' as u8 && num <= '9' as u8 || + num == '+' as u8 || num == '/' as u8) + }) + } else { + to_decode = to_decode.as_slice().replace("\n", ""); + to_decode.as_slice() + }; - if ignore_garbage { - let standard_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - to_decode = to_decode.as_slice() - .trim_chars(|c| !standard_chars.contains_char(c)) - .into_string() - } - - match to_decode.as_slice().from_base64() { + match slice.from_base64() { Ok(bytes) => { let mut out = stdout(); match out.write(bytes.as_slice()) { Ok(_) => {} - Err(f) => { crash!(1, "{}", f.to_string()); } + Err(f) => { crash!(1, "{}", f); } } match out.flush() { Ok(_) => {} - Err(f) => { crash!(1, "{}", f.to_string()); } + Err(f) => { crash!(1, "{}", f); } } } Err(s) => { - error!("error: {}", s.to_string()); + error!("error: {}", s); fail!() } } @@ -137,7 +150,7 @@ fn encode(input: &mut Reader, line_wrap: uint) { }; let to_encode = match input.read_to_end() { Ok(m) => m, - Err(f) => fail!(f.to_string()) + Err(err) => crash!(1, "{}", err) }; let encoded = to_encode.as_slice().to_base64(b64_conf); @@ -176,4 +189,3 @@ enum Mode { Help, Version } -