diff --git a/src/libs/metadata/bench/CMakeLists.txt b/src/libs/metadata/bench/CMakeLists.txt
index aa093de4..4e3a392d 100644
--- a/src/libs/metadata/bench/CMakeLists.txt
+++ b/src/libs/metadata/bench/CMakeLists.txt
@@ -1,6 +1,12 @@
add_executable(bench-metadata
LyricsBench.cpp
+ Metadata.cpp
+ )
+
+target_include_directories(bench-metadata PRIVATE
+ ../impl
+ ../test
)
target_link_libraries(bench-metadata PRIVATE
diff --git a/src/libs/metadata/bench/LyricsBench.cpp b/src/libs/metadata/bench/LyricsBench.cpp
index caa59ed5..2e1a213e 100644
--- a/src/libs/metadata/bench/LyricsBench.cpp
+++ b/src/libs/metadata/bench/LyricsBench.cpp
@@ -90,5 +90,3 @@ namespace lms::metadata::benchmarks
BENCHMARK(BM_Lyrics);
} // namespace lms::metadata::benchmarks
-
-BENCHMARK_MAIN();
\ No newline at end of file
diff --git a/src/libs/metadata/bench/Metadata.cpp b/src/libs/metadata/bench/Metadata.cpp
new file mode 100644
index 00000000..419e7424
--- /dev/null
+++ b/src/libs/metadata/bench/Metadata.cpp
@@ -0,0 +1,149 @@
+/*
+ * Copyright (C) 2024 Emeric Poupon
+ *
+ * This file is part of LMS.
+ *
+ * LMS is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * LMS is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with LMS. If not, see .
+ */
+
+#include
+
+#include "AudioFileParser.hpp"
+#include "TestTagReader.hpp"
+#include "core/String.hpp"
+#include "metadata/Types.hpp"
+
+namespace lms::metadata::benchmarks
+{
+ class TestAudioFileParser : public AudioFileParser
+ {
+ public:
+ using AudioFileParser::AudioFileParser;
+ using AudioFileParser::parseMetaData;
+ };
+
+ static void BM_Metadata_parse(benchmark::State& state)
+ {
+ AudioFileParserParameters params;
+ params.userExtraTags = { "MY_AWESOME_TAG_A", "MY_AWESOME_TAG_B", "MY_AWESOME_MISSING_TAG" };
+
+ std::unique_ptr testTags{ tests::createDefaultPopulatedTestTagReader() };
+
+ for (auto _ : state)
+ {
+ TestAudioFileParser parser{ params };
+ std::unique_ptr