diff --git a/core/pom.xml b/core/pom.xml
index a75acd5..38f7ea5 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -55,12 +55,38 @@
       <version>5.10.2</version>
       <scope>test</scope>
     </dependency>
+
+    <dependency>
+        <groupId>org.openjdk.jmh</groupId>
+        <artifactId>jmh-core</artifactId>
+        <version>1.35</version>
+        <scope>test</scope>
+    </dependency>
+    <dependency>
+        <groupId>org.openjdk.jmh</groupId>
+        <artifactId>jmh-generator-annprocess</artifactId>
+        <version>1.35</version>
+        <scope>test</scope>
+    </dependency>
   </dependencies>
 
   <build>
     <plugins>
 
       <plugin>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <configuration>
+          <annotationProcessorPaths>
+            <path>
+              <groupId>org.openjdk.jmh</groupId>
+              <artifactId>jmh-generator-annprocess</artifactId>
+              <version>1.35</version>
+            </path>
+          </annotationProcessorPaths>
+        </configuration>
+      </plugin>
+
+      <plugin>
         <artifactId>maven-jar-plugin</artifactId>
         <configuration>
           <archive>
@@ -73,10 +99,54 @@
 
       <plugin>
         <artifactId>maven-surefire-plugin</artifactId>
-        <version>3.2.5</version>
       </plugin>
 
     </plugins>
   </build>
 
+  <profiles>
+
+    <profile>
+      <id>benchmark</id>
+
+      <build>
+        <plugins>
+
+          <plugin>
+            <artifactId>maven-surefire-plugin</artifactId>
+            <configuration>
+              <skipTests>true</skipTests>
+            </configuration>
+          </plugin>
+
+          <plugin>
+            <groupId>org.codehaus.mojo</groupId>
+            <artifactId>exec-maven-plugin</artifactId>
+            <executions>
+              <execution>
+                <id>run-benchmarks</id>
+                <phase>integration-test</phase>
+                <goals>
+                  <goal>exec</goal>
+                </goals>
+                <configuration>
+                  <classpathScope>test</classpathScope>
+                  <executable>java</executable>
+                  <arguments>
+                    <argument>-classpath</argument>
+                    <classpath />
+                    <argument>org.openjdk.jmh.Main</argument>
+                    <argument>.*</argument>
+                  </arguments>
+                </configuration>
+              </execution>
+            </executions>
+          </plugin>
+
+        </plugins>
+      </build>
+    </profile>
+
+  </profiles>
+
 </project>
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;
+  }
 }
