$ gcc -O3 -Wall -Wextra upper.c -o upper-c
$ rustc -O upper.rs -o upper-rs
$ find /usr/bin/ -type f -exec strings {} + > /tmp/ascii
$ tr [[:lower:]] [[:upper:]] < /tmp/ascii | md5sum
cba0b362aac1eb264e518a33aa2b57eb -
$ ./upper-c < /tmp/ascii | md5sum
cba0b362aac1eb264e518a33aa2b57eb -
$ ./upper-rs < /tmp/ascii | md5sum
cba0b362aac1eb264e518a33aa2b57eb -
$ time tr [[:lower:]] [[:upper:]] < /tmp/ascii > /dev/null
real 0m0.014s
user 0m0.004s
sys 0m0.011s
$ time ./upper-c < /tmp/ascii > /dev/null
real 0m0.013s
user 0m0.004s
sys 0m0.009s
$ time ./upper-rs < /tmp/ascii > /dev/null
real 0m0.008s
user 0m0.000s
sys 0m0.008s
-
upper.c
:#include <ctype.h> #include <stdio.h> int main() { char input[4 * 1024]; size_t len; size_t i; while(!feof(stdin)) { len = fread(input, 1, sizeof(input), stdin); if(len < 1) break; for(i = 0; i < len; i++) { input[i] = toupper(input[i]); } if(fwrite(input, len, 1, stdout) < 1) break; } }
-
upper.rs
:use std::io::{Write, Read}; fn main() { let stdout = std::io::stdout(); let mut output = std::io::BufWriter::new(stdout.lock()); let stdin = std::io::stdin(); let mut reader = std::io::BufReader::new(stdin.lock()); let mut buf = [0; 4 * 1024]; while let Ok(len) = reader.read(&mut buf) { if len == 0 { break; } for byte in &mut buf[..len] { *byte = byte.to_ascii_uppercase(); } if output.write_all(&buf[..len]).is_err() { break; } } }