diff --git a/.gitignore b/.gitignore
index f5734409e..9a41520a5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -260,4 +260,7 @@ paket-files/
# Python Tools for Visual Studio (PTVS)
__pycache__/
-*.pyc
\ No newline at end of file
+*.pyc
+
+# BenchmarkDotNet artifacts
+**/BenchmarkDotNet.Artifacts/**
diff --git a/Gw2Sharp.Benchmarks/Gw2Sharp.Benchmarks.csproj b/Gw2Sharp.Benchmarks/Gw2Sharp.Benchmarks.csproj
new file mode 100644
index 000000000..17ab8066c
--- /dev/null
+++ b/Gw2Sharp.Benchmarks/Gw2Sharp.Benchmarks.csproj
@@ -0,0 +1,25 @@
+
+
+
+ Exe
+ net6.0;net5.0
+ enable
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+ TestFiles\%(RecursiveDir)%(Filename)%(Extension)
+ PreserveNewest
+
+
+
+
diff --git a/Gw2Sharp.Benchmarks/ItemsPageDeserializeBenchmark.cs b/Gw2Sharp.Benchmarks/ItemsPageDeserializeBenchmark.cs
new file mode 100644
index 000000000..ca8b3f539
--- /dev/null
+++ b/Gw2Sharp.Benchmarks/ItemsPageDeserializeBenchmark.cs
@@ -0,0 +1,39 @@
+using System;
+using System.IO;
+using System.Text.Json;
+using BenchmarkDotNet.Attributes;
+using Gw2Sharp.WebApi.V2;
+using Gw2Sharp.WebApi.V2.Models;
+
+namespace Gw2Sharp.Benchmarks
+{
+ [MedianColumn]
+ [MemoryDiagnoser]
+ public class ItemsPageDeserializeBenchmark
+ {
+ private const int OPERATIONS_PER_INVOKE = 50;
+ private byte[] jsonBytes = Array.Empty();
+ private JsonSerializerOptions? jsonSerializerOptions = null;
+ private object? dump;
+
+ [GlobalSetup]
+ public void GlobalSetup()
+ {
+ string path = Path.Combine("TestFiles", "Items", "Items.max_page_size.json");
+ this.jsonBytes = System.IO.File.ReadAllBytes(path);
+ this.jsonSerializerOptions = SerializationHelpers.GetJsonSerializerOptions();
+ }
+
+ [Benchmark(OperationsPerInvoke=OPERATIONS_PER_INVOKE)]
+ public object DeserializeItemsPage()
+ {
+ for (int i = 0; i < OPERATIONS_PER_INVOKE; ++i)
+ {
+ this.dump = JsonSerializer.Deserialize>(this.jsonBytes, this.jsonSerializerOptions);
+ }
+
+ return this.dump!;
+ }
+ }
+}
+
diff --git a/Gw2Sharp.Benchmarks/ItemsPageGetCachedBenchmark.cs b/Gw2Sharp.Benchmarks/ItemsPageGetCachedBenchmark.cs
new file mode 100644
index 000000000..879aa1df3
--- /dev/null
+++ b/Gw2Sharp.Benchmarks/ItemsPageGetCachedBenchmark.cs
@@ -0,0 +1,45 @@
+using System.Threading.Tasks;
+using BenchmarkDotNet.Attributes;
+
+namespace Gw2Sharp.Benchmarks
+{
+ ///
+ /// This benchmark essentially checks how much time
+ /// it takes to retrieve items page from the cache.
+ /// The page is initially loaded in
+ /// via once and retrieved from the same
+ /// instance during the benchmark.
+ ///
+ [MedianColumn]
+ [MemoryDiagnoser]
+ public class ItemsPageGetCachedBenchmark
+ {
+ private const int OPERATIONS_PER_INVOKE = 10;
+ private Connection? connection;
+ private Gw2Client? gw2Client;
+ private object? dump;
+
+ [GlobalSetup]
+ public async Task GlobalSetupAsync()
+ {
+ this.connection = new Connection();
+ this.gw2Client = new Gw2Client(this.connection);
+ await this.gw2Client.WebApi.V2.Items.PageAsync(1).ConfigureAwait(false);
+ }
+
+ [GlobalCleanup]
+ public void GlobalCleanup() => this.gw2Client!.Dispose();
+
+ [Benchmark(OperationsPerInvoke=OPERATIONS_PER_INVOKE)]
+ public async Task