diff --git a/core/src/test/java/eu/mulk/quarkus/googlecloud/jsonlogging/FormatterBenchmark.java b/core/src/test/java/eu/mulk/quarkus/googlecloud/jsonlogging/FormatterBenchmark.java
new file mode 100644
index 0000000..1a1c17c
--- /dev/null
+++ b/core/src/test/java/eu/mulk/quarkus/googlecloud/jsonlogging/FormatterBenchmark.java
@@ -0,0 +1,34 @@
+package eu.mulk.quarkus.googlecloud.jsonlogging;
+
+import java.util.List;
+import org.jboss.logmanager.ExtLogRecord;
+import org.openjdk.jmh.annotations.*;
+import org.openjdk.jmh.infra.Blackhole;
+
+@Warmup(iterations = 5, time = 1)
+@Measurement(iterations = 10, time = 1)
+@Fork(value = 1)
+@State(org.openjdk.jmh.annotations.Scope.Benchmark)
+public class FormatterBenchmark {
+
+  private ExtLogRecord simpleLogRecord;
+  private ExtLogRecord structuredLogRecord;
+  private Formatter formatter;
+
+  @Setup
+  public void setup() {
+    simpleLogRecord = FormatterTest.makeSimpleRecord();
+    structuredLogRecord = FormatterTest.makeStructuredRecord();
+    formatter = new Formatter(List.of(), List.of());
+  }
+
+  @Benchmark
+  public void simpleLogRecord(Blackhole blackhole) {
+    blackhole.consume(formatter.format(simpleLogRecord));
+  }
+
+  @Benchmark
+  public void structuredLogRecord(Blackhole blackhole) {
+    blackhole.consume(formatter.format(structuredLogRecord));
+  }
+}
diff --git a/core/src/test/java/eu/mulk/quarkus/googlecloud/jsonlogging/FormatterTest.java b/core/src/test/java/eu/mulk/quarkus/googlecloud/jsonlogging/FormatterTest.java
index 49cda39..91cc8e4 100644
--- a/core/src/test/java/eu/mulk/quarkus/googlecloud/jsonlogging/FormatterTest.java
+++ b/core/src/test/java/eu/mulk/quarkus/googlecloud/jsonlogging/FormatterTest.java
@@ -1,20 +1,19 @@
 package eu.mulk.quarkus.googlecloud.jsonlogging;
 
+import static org.junit.jupiter.api.Assertions.assertLinesMatch;
+
 import jakarta.json.Json;
+import java.util.Collection;
+import java.util.List;
 import org.jboss.logmanager.ExtLogRecord;
 import org.jboss.logmanager.Level;
 import org.junit.jupiter.api.Test;
 
-import java.util.Collection;
-import java.util.List;
-
-import static org.junit.jupiter.api.Assertions.assertLinesMatch;
-
 class FormatterTest {
 
   @Test
   void simpleRecord() {
-    var logRecord = new ExtLogRecord(Level.INFO, "Hello, world!", FormatterTest.class.getName());
+    var logRecord = makeSimpleRecord();
 
     var formatter = new Formatter(List.of(), List.of());
     var formattingResult = formatter.format(logRecord);
@@ -34,6 +33,10 @@
         List.of(formattingResult));
   }
 
+  static ExtLogRecord makeSimpleRecord() {
+    return new ExtLogRecord(Level.INFO, "Hello, world!", FormatterTest.class.getName());
+  }
+
   @Test
   void structuredRecord() {
     var parameterProvider =
@@ -55,13 +58,7 @@
           }
         };
 
-    var logRecord = new ExtLogRecord(Level.INFO, "Hello, world!", FormatterTest.class.getName());
-    logRecord.setParameters(
-        new Object[] {
-          (StructuredParameter)
-              () -> Json.createObjectBuilder().add("one", 1).add("two", 2.0).add("yes", true),
-          Label.of("a", "b")
-        });
+    var logRecord = makeStructuredRecord();
 
     var formatter = new Formatter(List.of(parameterProvider), List.of(labelProvider));
     var formattingResult = formatter.format(logRecord);
@@ -85,4 +82,15 @@
                 + "\\}\n"),
         List.of(formattingResult));
   }
+
+  static ExtLogRecord makeStructuredRecord() {
+    var logRecord = makeSimpleRecord();
+    logRecord.setParameters(
+        new Object[] {
+          (StructuredParameter)
+              () -> Json.createObjectBuilder().add("one", 1).add("two", 2.0).add("yes", true),
+          Label.of("a", "b")
+        });
+    return logRecord;
+  }
 }
