-
-
Notifications
You must be signed in to change notification settings - Fork 10
Expand file tree
/
Copy pathCacheCommandTests.cs
More file actions
113 lines (101 loc) · 3.62 KB
/
Copy pathCacheCommandTests.cs
File metadata and controls
113 lines (101 loc) · 3.62 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
using BenchmarkDotNet.Attributes;
using Npgsql;
namespace BenchmarkTests;
public class NpgsqlCachedCommand : NpgsqlCommand
{
private static readonly NpgsqlCachedCommand _instanceCache = new();
#pragma warning disable CS8603 // Possible null reference return.
private NpgsqlCommand CachedCommandClone() => MemberwiseClone() as NpgsqlCommand;
#pragma warning restore CS8603 // Possible null reference return.
public static NpgsqlCommand Create(NpgsqlConnection connection)
{
var result = _instanceCache.CachedCommandClone();
result.Connection = connection;
return result;
}
}
public class NpgsqlCachedParameter : NpgsqlParameter
{
private static readonly NpgsqlCachedParameter _textParam = new()
{
NpgsqlDbType = NpgsqlTypes.NpgsqlDbType.Text,
Value = DBNull.Value,
};
#pragma warning disable CS8603 // Possible null reference return.
public NpgsqlParameter CachedParameterMemberwiseClone() => MemberwiseClone() as NpgsqlParameter;
#pragma warning restore CS8603 // Possible null reference return.
public static NpgsqlParameter CreateTextParam(string? value)
{
var result = _textParam.CachedParameterMemberwiseClone();
if (value is not null)
{
result.Value = value;
}
return result;
}
}
[MemoryDiagnoser]
public class CacheCommandTests
{
private const string _connectionStr = "Host=127.0.0.1;Port=5432;Database=postgres;Username=postgres;Password=postgres";
[Benchmark(Baseline = true)]
public async Task NormalCommand()
{
using var connection = new NpgsqlConnection(_connectionStr);
connection.Open();
using var cmd = connection.CreateCommand();
cmd.CommandText = "select $1,$2,$3";
cmd.Parameters.Add(new NpgsqlParameter
{
NpgsqlDbType = NpgsqlTypes.NpgsqlDbType.Text,
Value = "test1"
});
cmd.Parameters.Add(new NpgsqlParameter
{
NpgsqlDbType = NpgsqlTypes.NpgsqlDbType.Text,
Value = "test2"
});
cmd.Parameters.Add(new NpgsqlParameter
{
NpgsqlDbType = NpgsqlTypes.NpgsqlDbType.Text,
Value = "test3"
});
await using var reader = await cmd.ExecuteReaderAsync();
}
[Benchmark]
public async Task CachedCommand()
{
using var connection = new NpgsqlConnection(_connectionStr);
connection.Open();
using var cmd = NpgsqlCachedCommand.Create(connection);
cmd.CommandText = "select $1,$2,$3";
cmd.Parameters.Add(new NpgsqlParameter
{
NpgsqlDbType = NpgsqlTypes.NpgsqlDbType.Text,
Value = "test1"
});
cmd.Parameters.Add(new NpgsqlParameter
{
NpgsqlDbType = NpgsqlTypes.NpgsqlDbType.Text,
Value = "test2"
});
cmd.Parameters.Add(new NpgsqlParameter
{
NpgsqlDbType = NpgsqlTypes.NpgsqlDbType.Text,
Value = "test3"
});
await using var reader = await cmd.ExecuteReaderAsync();
}
[Benchmark]
public async Task CachedCommandAndParemeters()
{
using var connection = new NpgsqlConnection(_connectionStr);
connection.Open();
using var cmd = NpgsqlCachedCommand.Create(connection);
cmd.CommandText = "select $1,$2,$3";
cmd.Parameters.Add(NpgsqlCachedParameter.CreateTextParam("test1"));
cmd.Parameters.Add(NpgsqlCachedParameter.CreateTextParam("test2"));
cmd.Parameters.Add(NpgsqlCachedParameter.CreateTextParam("test3"));
await using var reader = await cmd.ExecuteReaderAsync();
}
}