From f628e70d4aa70b96f2126b376ec75014af0b62cb Mon Sep 17 00:00:00 2001 From: Arcterus Date: Sun, 30 Nov 2014 15:28:00 -0800 Subject: [PATCH] tr: improve speed slightly --- src/tr/tr.rs | 39 ++++++++++++++++++++++++++------------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/src/tr/tr.rs b/src/tr/tr.rs index e03b5d7e6..157c0fa55 100644 --- a/src/tr/tr.rs +++ b/src/tr/tr.rs @@ -13,10 +13,9 @@ extern crate collections; extern crate getopts; -use collections::bitv_set::BitvSet; -use collections::vec_map::VecMap; use getopts::OptGroup; use std::char::from_u32; +use std::collections::{BitvSet, VecMap}; use std::io::print; use std::io::stdio::{stdin,stdout}; use std::iter::FromIterator; @@ -28,6 +27,7 @@ mod util; static NAME : &'static str = "tr"; static VERSION : &'static str = "1.0.0"; +#[inline] fn unescape_char(c: char) -> char { match c { 'a' => 0x07u8 as char, @@ -41,6 +41,7 @@ fn unescape_char(c: char) -> char { } } +#[inline] fn unescape(v: Vec) -> Vec { let mut out = Vec::new(); let mut input = v.as_slice(); @@ -60,6 +61,7 @@ fn unescape(v: Vec) -> Vec { out } +#[inline] fn expand_range(from: char, to: char) -> Vec { range(from as u32, to as u32 + 1).map(|c| from_u32(c).unwrap()).collect() } @@ -109,12 +111,16 @@ fn delete(set: Vec, complement: bool) { } fn tr(set1: &[char], set2: &[char]) { - let mut map = VecMap::::new(); - let mut out = stdout(); + const BUFFER_LEN: uint = 1024; + let mut map = VecMap::new(); + let mut stdout = stdout(); + let mut outbuffer = String::with_capacity(BUFFER_LEN); + + let set2_len = set2.len(); for i in range(0, set1.len()) { - if i >= set2.len() { - map.insert(set1[i] as uint, set2[set2.len()-1]); + if i >= set2_len { + map.insert(set1[i] as uint, set2[set2_len - 1]); } else { map.insert(set1[i] as uint, set2[i]); } @@ -127,22 +133,29 @@ fn tr(set1: &[char], set2: &[char]) { Some(t) => *t, None => inc, }; - out.write_char(trc).unwrap(); + outbuffer.push(trc); + if outbuffer.len() >= BUFFER_LEN { + stdout.write_str(outbuffer.as_slice()).unwrap(); + outbuffer.clear(); + } } Err(err) => { panic!("{}", err); } } } + if outbuffer.len() > 0 { + stdout.write_str(outbuffer.as_slice()).unwrap(); + } } fn usage(opts: &[OptGroup]) { - println!("{} {}", NAME, VERSION); - println!(""); - println!("Usage:"); - println!(" {} [OPTIONS] SET1 [SET2]", NAME); - println!(""); - print(getopts::usage("Translate or delete characters.", opts).as_slice()); + println!("{} {}", NAME, VERSION); + println!(""); + println!("Usage:"); + println!(" {} [OPTIONS] SET1 [SET2]", NAME); + println!(""); + print(getopts::usage("Translate or delete characters.", opts).as_slice()); } pub fn uumain(args: Vec) -> int {