Comparison between k_board and termion 🦀⌨️
Tags: rust, programming, coding, development
Published: 2023-10-23 12:40:03

In this article, I'm going to compare the efficiency of two powerful keyboard handlers in the Rust ecosystem, namely [k_board](https://crates.io/crates/k_board) and [termion](https://crates.io/crates/termion).

To determine which one is more efficient, I will compare the final footprint of a file with each development dependency running the same code:

> Print 'UP!' if the up arrow key is pressed, print 'DOWN!' if the down arrow key is pressed, and exit the program if the enter key is pressed.

## termion code & final space

```rust
use termion::input::TermRead;
use termion::raw::IntoRawMode;
use std::io::Write;

fn main() {
    let mut stdout = std::io::stdout().into_raw_mode().unwrap();
    let stdin: std::io::Stdin = std::io::stdin();
    for c in stdin.keys() {
        match c.unwrap() {
            termion::event::Key::Up => println!("Up!"),
            termion::event::Key::Down => println!("Down!"),
            termion::event::Key::Char('\n') => break,
            _ => {}
        }
        stdout.flush().unwrap();
    }
}
```

```
mateo@debian:~/Dev$ du -h pruebas/
64K	pruebas/.git/hooks
4,0K	pruebas/.git/objects/pack
4,0K	pruebas/.git/objects/info
12K	pruebas/.git/objects
4,0K	pruebas/.git/refs/heads
4,0K	pruebas/.git/refs/tags
12K	pruebas/.git/refs
8,0K	pruebas/.git/info
112K	pruebas/.git
12K	pruebas/src
14M	pruebas/target/release/deps
12K	pruebas/target/release/.fingerprint/libc-f4899200925cd573
20K	pruebas/target/release/.fingerprint/libc-0b715d722187b0c6
20K	pruebas/target/release/.fingerprint/pruebas-801f0ed4b4a9017c
20K	pruebas/target/release/.fingerprint/numtoa-5db795b61c1068b6
20K	pruebas/target/release/.fingerprint/termion-57b99c4cdcd30adf
20K	pruebas/target/release/.fingerprint/libc-1e1f3236a10c7892
116K	pruebas/target/release/.fingerprint
4,0K	pruebas/target/release/examples
4,0K	pruebas/target/release/build/libc-f4899200925cd573/out
20K	pruebas/target/release/build/libc-f4899200925cd573
4,6M	pruebas/target/release/build/libc-1e1f3236a10c7892
4,6M	pruebas/target/release/build
4,0K	pruebas/target/release/incremental
18M	pruebas/target/release
18M	pruebas/target
19M	pruebas/
```
**19 MB** memory space used.

## k_board code & final space

```rust
fn main() {
    for key in k_board::Keyboard::new() {
        match key {
            k_board::Keys::Up => println!("Up!"),
            k_board::Keys::Down => println!("Down!"),
            k_board::Keys::Enter => break,
            _ => {}
        }
    }
}
```

```
mateo@debian:~/Dev$ du -h pruebas/
64K	pruebas/.git/hooks
4,0K	pruebas/.git/objects/pack
4,0K	pruebas/.git/objects/info
12K	pruebas/.git/objects
4,0K	pruebas/.git/refs/heads
4,0K	pruebas/.git/refs/tags
12K	pruebas/.git/refs
8,0K	pruebas/.git/info
112K	pruebas/.git
8,0K	pruebas/src
4,6M	pruebas/target/release/deps
20K	pruebas/target/release/.fingerprint/pruebas-3a8501bba3baba89
20K	pruebas/target/release/.fingerprint/k_board-217281d3fbdf4f77
44K	pruebas/target/release/.fingerprint
4,0K	pruebas/target/release/examples
4,0K	pruebas/target/release/build
4,0K	pruebas/target/release/incremental
4,6M	pruebas/target/release
4,6M	pruebas/target
4,8M	pruebas/
```
**4,8 MB** memory space used.

--- 

After performing the same task, we can see that **k_board is 3.96 times lighter than termion.** Additionally, it has a cleaner and more concise syntax.