diff --git a/src/entrypoints/fft-benchmark.cpp b/src/entrypoints/fft-benchmark.cpp
index c7c80730b099513404e5fc80ad0f5879918d50ac..53c5ebbce529093e30f0f18f2fe28d72d125cf61 100644
--- a/src/entrypoints/fft-benchmark.cpp
+++ b/src/entrypoints/fft-benchmark.cpp
@@ -22,36 +22,70 @@
 
 #pragma once
 
-#include <iostream>
-#include <Eigen/Dense>
-#include <miosix.h>
-#include <complex.h>
-#include <math.h>
 #include <algorithms/FFT.h>
+#include <drivers/timer/TimestampTimer.h>
+#include <utils/Stats/Stats.h>
+
+#include <Eigen/Dense>
+#include <array>
 
 using namespace Boardcore;
+using namespace std;
 
-int main(int argc, char const *argv[])
-{
-    Eigen::Vector<float, 256> input_signal = Eigen::Vector<float, 256>::Zero();
-    float f1, f2;
+const unsigned int TAKES  = 5000;
+const unsigned int BUFFER = 32;
 
-    f1 = 50;
-    f2 = 25;
+array<float, TAKES> data;
 
-    for (size_t i = 0; i < input_signal.size(); i++)
-    {
-        input_signal(i) = sin(2 * M_PI * i / 256 * f1) + sin(2 * M_PI * i / 256 * f2);
-    }
+/**
+ * @brief Prints the test results for the specified buffer size.
+ *
+ * @param bufferSize Buffer size of the benchmark.
+ * @param results Results form the benchmark.
+ */
+void printResults(size_t bufferSize, array<float, TAKES>& results);
 
-    Eigen::Vector<std::complex<float>, 256> fft_result = FFT<256>::fft(input_signal);
-    Eigen::Vector<float, 256> fft_freq = FFT<256>::fftfreq(1.0 / 256.0);
+int main()
+{
+    Eigen::Vector<float, BUFFER> input_signal =
+        Eigen::Vector<float, BUFFER>::Zero();
 
-    std::cout << "FFT result:" << std::endl;
-    for (size_t i = 0; i < fft_result.size(); i++)
+    for (int i = 0; i < TAKES; i++)
     {
-        std::cout << fft_freq(i) << ' ' << fft_result(i).real() << std::endl;
+        for (size_t i = 0; i < input_signal.size(); i++)
+        {
+            input_signal(i) = (float)rand() / RAND_MAX;
+        }
+
+        int64_t duration = TimestampTimer::getTimestamp();
+        FFT<BUFFER>::fft(input_signal);
+        duration = TimestampTimer::getTimestamp() - duration;
+        data[i]  = duration;
     }
 
+    printResults(BUFFER, data);
+
     return 0;
 }
+
+void printResults(size_t bufferSize, array<float, TAKES>& results)
+{
+    // Compute statistics on the benchmark results
+    Stats stats;
+    for (float result : results)
+        stats.add(result);
+    StatsResult statsResults = stats.getStats();
+
+    printf("\tBuffer size: %lu\n", (unsigned long)bufferSize);
+    printf("Times:\n");
+    printf("- mean:    % 6.1f us\n", statsResults.mean);
+    printf("- std dev: % 6.1f us\n", statsResults.stdDev);
+    printf("- min:     % 6.1f us\n", statsResults.minValue);
+    printf("- max:     % 6.1f us\n", statsResults.maxValue);
+    printf("Speeds:\n");
+    printf("- mean: % 6.2f Hz\n", 1e6 / statsResults.mean);
+    printf("- min:  % 6.2f Hz\n", 1e6 / statsResults.maxValue);
+    printf("- max:  % 6.2f Hz\n", 1e6 / statsResults.minValue);
+
+    printf("\n");
+}