-
Notifications
You must be signed in to change notification settings - Fork 888
Expand file tree
/
Copy pathGetFieldValue.cs
More file actions
62 lines (50 loc) · 1.83 KB
/
Copy pathGetFieldValue.cs
File metadata and controls
62 lines (50 loc) · 1.83 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
using System;
using System.Linq;
using BenchmarkDotNet.Attributes;
namespace Npgsql.Benchmarks;
[OperationsPerSecond, PerElementMean]
public class GetFieldValue
{
readonly NpgsqlConnection _conn;
readonly NpgsqlCommand _cmd;
readonly NpgsqlDataReader _reader;
const int ArrayLength = 100;
public GetFieldValue()
{
_conn = BenchmarkEnvironment.OpenConnection();
var ints = string.Join(",", Enumerable.Range(0, ArrayLength));
var timestamps = string.Join(",", Enumerable.Range(0, ArrayLength)
.Select(i => $"'2026-01-01'::timestamp + interval '{i} days'"));
var strings = string.Join(",", Enumerable.Range(0, ArrayLength)
.Select(i => $"'some realistic text value #{i:0000}'"));
_cmd = new NpgsqlCommand(
"SELECT 0, 'str', " +
$"ARRAY[{ints}]::integer[], " +
$"ARRAY[{timestamps}], " +
$"ARRAY[{strings}]::text[]",
_conn);
_reader = _cmd.ExecuteReader();
_reader.Read();
}
[GlobalCleanup]
public void Cleanup()
{
_reader.Dispose();
_cmd.Dispose();
_conn.Dispose();
}
[Benchmark]
public void NullableField() => _reader.GetFieldValue<int?>(0);
[Benchmark]
public void ValueTypeField() => _reader.GetFieldValue<int>(0);
[Benchmark]
public void ReferenceTypeField() => _reader.GetFieldValue<string>(1);
[Benchmark]
public void ObjectField() => _reader.GetFieldValue<object>(1);
[Benchmark, PerElement(ArrayLength)]
public void IntArrayField() => _reader.GetFieldValue<int[]>(2);
[Benchmark, PerElement(ArrayLength)]
public void DateTimeArrayField() => _reader.GetFieldValue<DateTime[]>(3);
[Benchmark, PerElement(ArrayLength)]
public void StringArrayField() => _reader.GetFieldValue<string[]>(4);
}