diff --git a/examples/benchmark/Cargo.toml b/examples/benchmark/Cargo.toml
new file mode 100644
index 0000000000000000000000000000000000000000..81438038316f1b576b71c6f15038f4afcd7b637a
--- /dev/null
+++ b/examples/benchmark/Cargo.toml
@@ -0,0 +1,16 @@
+[package]
+name = "chip-ahoyto-benchmark"
+version = "0.1.0"
+authors = ["João Magalhães <joamag@gmail.com>"]
+description = "CHIP-8 Benchmark application"
+license = "Apache-2.0"
+keywords = ["chip-8", "emulator", "rust", "benchmark"]
+edition = "2018"
+
+[dependencies.chip-ahoyto]
+path = "../.."
+
+[profile.release]
+debug = false
+lto = true
+opt-level = 3
diff --git a/examples/benchmark/resources/pong.ch8 b/examples/benchmark/resources/pong.ch8
new file mode 100644
index 0000000000000000000000000000000000000000..295ce91c67214cf73298959781e6c1c089b55d2a
Binary files /dev/null and b/examples/benchmark/resources/pong.ch8 differ
diff --git a/examples/benchmark/src/main.rs b/examples/benchmark/src/main.rs
new file mode 100644
index 0000000000000000000000000000000000000000..5ef3f0face4af6e7a2ef616ba6db3725790f11a1
--- /dev/null
+++ b/examples/benchmark/src/main.rs
@@ -0,0 +1,25 @@
+use chip_ahoyto::chip8::Chip8;
+use std::{fs::File, io::Read};
+
+const CYCLE_COUNT: u32 = 1_000_000_000;
+
+fn main() {
+    let rom = read_file("./resources/pong.ch8");
+
+    let mut chip8 = Chip8::new();
+    chip8.reset_hard();
+    chip8.load_rom(&rom);
+
+    println!("Running {} cycles", CYCLE_COUNT);
+
+    for _ in 0..CYCLE_COUNT {
+        chip8.tick();
+    }
+}
+
+fn read_file(path: &str) -> Vec<u8> {
+    let mut file = File::open(path).unwrap();
+    let mut data = Vec::new();
+    file.read_to_end(&mut data).unwrap();
+    data
+}
diff --git a/examples/sdl/src/main.rs b/examples/sdl/src/main.rs
index 518ec6edaa9d3930feff8974b22113a98693ebfe..13d4c1ea69c2d211e241abe8fcabd00a7be5005a 100644
--- a/examples/sdl/src/main.rs
+++ b/examples/sdl/src/main.rs
@@ -272,9 +272,7 @@ fn main() {
             for _ in 0..logic_visual_ratio {
                 // runs the tick operation in the CHIP-8 system,
                 // effectively changing the logic state of the machine
-                state.system.clock();
-                state.system.clock_dt();
-                state.system.clock_st();
+                state.system.tick();
                 beep |= state.system.beep();
             }
 
@@ -348,7 +346,7 @@ fn key_to_btn(keycode: Keycode) -> Option<u8> {
 
 fn read_file(path: &str) -> Vec<u8> {
     let mut file = File::open(path).unwrap();
-    let mut rom = Vec::new();
-    file.read_to_end(&mut rom).unwrap();
-    rom
+    let mut data = Vec::new();
+    file.read_to_end(&mut data).unwrap();
+    data
 }
diff --git a/src/chip8.rs b/src/chip8.rs
index f8135ca093807ee3c5d72edf74714b832edf5cac..614f27eea057b517c80583f08719133dc0d6ab95 100644
--- a/src/chip8.rs
+++ b/src/chip8.rs
@@ -120,6 +120,12 @@ impl Chip8 {
         self.ram[ROM_START..ROM_START + rom.len()].clone_from_slice(rom);
     }
 
+    pub fn tick(&mut self) {
+        self.clock();
+        self.clock_dt();
+        self.clock_st();
+    }
+
     pub fn clock(&mut self) {
         let opcode = self.fetch_opcode();
         self.process_opcode(opcode);