forked from roji/Npgsql
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathReadColumns.cs
More file actions
76 lines (66 loc) · 1.98 KB
/
ReadColumns.cs
File metadata and controls
76 lines (66 loc) · 1.98 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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using BenchmarkDotNet.Attributes;
namespace Npgsql.Benchmarks
{
[Config("columns=OperationPerSecond")]
public class ReadColumns
{
NpgsqlConnection _conn;
NpgsqlCommand _cmd;
[Params(1, 10, 100, 1000)]
public int NumColumns { get; set; } = 100;
static readonly string[] Queries;
[GlobalSetup]
public void GlobalSetup()
{
_conn = BenchmarkEnvironment.OpenConnection();
_cmd = new NpgsqlCommand(Queries[NumColumns], _conn);
}
[GlobalCleanup]
public void Cleanup()
{
_cmd.Dispose();
_conn.Dispose();
}
[Benchmark]
public int IntColumn()
{
unchecked
{
var x = 0;
using (var reader = _cmd.ExecuteReader())
{
reader.Read();
for (var i = 0; i < NumColumns; i++)
x += reader.GetInt32(i);
}
return x;
}
}
static ReadColumns()
{
Queries = new string[NumColumnsValues.Max() + 1];
Queries[0] = "SELECT 1 WHERE 1=0";
foreach (var numColumns in NumColumnsValues.Where(i => i != 0))
Queries[numColumns] = GenerateQuery(numColumns);
}
static string GenerateQuery(int numColumns)
{
var sb = new StringBuilder()
.Append("SELECT ")
.Append(string.Join(",", Enumerable.Range(0, numColumns)))
.Append(";");
return sb.ToString();
}
static readonly int[] NumColumnsValues = typeof(ReadColumns)
.GetProperty(nameof(NumColumns))
.GetCustomAttribute<ParamsAttribute>()
.Values
.Cast<int>()
.ToArray();
}
}