Skip to content

Instantly share code, notes, and snippets.

@ayosec
Last active March 7, 2021 10:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ayosec/b87af01c32fb9afd9bb079ea0616038d to your computer and use it in GitHub Desktop.
Save ayosec/b87af01c32fb9afd9bb079ea0616038d to your computer and use it in GitHub Desktop.

to upper

$ 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

Files

  • 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;
            }
        }
    }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment