From c2c87c5c618743f6ff4a7a965e3ac88b58df43cc Mon Sep 17 00:00:00 2001 From: Marius Thesing Date: Sat, 8 Aug 2026 11:46:33 +0200 Subject: [PATCH] reduce allocations in NpgsqlParameterCollection.AddRange --- src/Npgsql/NpgsqlParameterCollection.cs | 1 + test/Npgsql.Benchmarks/ParameterCollection.cs | 30 +++++++++++++++++++ 2 files changed, 31 insertions(+) create mode 100644 test/Npgsql.Benchmarks/ParameterCollection.cs diff --git a/src/Npgsql/NpgsqlParameterCollection.cs b/src/Npgsql/NpgsqlParameterCollection.cs index 917eb9311b..d5fff69c6d 100644 --- a/src/Npgsql/NpgsqlParameterCollection.cs +++ b/src/Npgsql/NpgsqlParameterCollection.cs @@ -589,6 +589,7 @@ IEnumerator IEnumerable.GetEnumerator() public override void AddRange(Array values) { ArgumentNullException.ThrowIfNull(values); + InternalList.EnsureCapacity(InternalList.Count + values.Length); foreach (var parameter in values) Add(Cast(parameter)); diff --git a/test/Npgsql.Benchmarks/ParameterCollection.cs b/test/Npgsql.Benchmarks/ParameterCollection.cs new file mode 100644 index 0000000000..0e09fb458b --- /dev/null +++ b/test/Npgsql.Benchmarks/ParameterCollection.cs @@ -0,0 +1,30 @@ +using System.Collections.Generic; +using BenchmarkDotNet.Attributes; + +namespace Npgsql.Benchmarks; + +[MemoryDiagnoser] +public class ParameterCollection +{ + private NpgsqlParameter[] manyParameters = []; + + [IterationSetup] + public void IterationSetup() + { + List parameters = []; + + for (var i = 0; i < 2000; i++) + { + parameters.Add(new NpgsqlParameter()); + } + + manyParameters = parameters.ToArray(); + } + + [Benchmark] + public void AddRange() + { + NpgsqlParameterCollection parameterCollection = []; + parameterCollection.AddRange(manyParameters); + } +}