Skip to content

Commit 25ca672

Browse files
committed
Improve updates
1 parent a464ca7 commit 25ca672

3 files changed

Lines changed: 25 additions & 65 deletions

File tree

src/BenchmarksApps/TechEmpower/PlatformBenchmarks/Data/Random.cs

Lines changed: 0 additions & 32 deletions
This file was deleted.

src/BenchmarksApps/TechEmpower/PlatformBenchmarks/Data/RawDb.cs

Lines changed: 24 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ namespace PlatformBenchmarks
1515
{
1616
public sealed class RawDb
1717
{
18-
private readonly ConcurrentRandom _random;
1918
private readonly MemoryCache _cache
2019
= new(new MemoryCacheOptions { ExpirationScanFrequency = TimeSpan.FromMinutes(60) });
2120

@@ -25,9 +24,8 @@ private readonly MemoryCache _cache
2524
private readonly string _connectionString;
2625
#endif
2726

28-
public RawDb(ConcurrentRandom random, AppSettings appSettings)
27+
public RawDb(AppSettings appSettings)
2928
{
30-
_random = random;
3129
#if NET8_0_OR_GREATER
3230
_dataSource = new NpgsqlSlimDataSourceBuilder(appSettings.ConnectionString).Build();
3331
#elif NET7_0
@@ -53,10 +51,10 @@ public Task<CachedWorld[]> LoadCachedQueries(int count)
5351
var result = new CachedWorld[count];
5452
var cacheKeys = _cacheKeys;
5553
var cache = _cache;
56-
var random = _random;
54+
5755
for (var i = 0; i < result.Length; i++)
5856
{
59-
var id = random.Next(1, 10001);
57+
var id = Random.Shared.Next(1, 10001);
6058
var key = cacheKeys[id];
6159
if (cache.TryGetValue(key, out var cached))
6260
{
@@ -88,7 +86,7 @@ static async Task<CachedWorld[]> LoadUncachedQueries(int id, int i, int count, R
8886
{
8987
result[i] = await rawdb._cache.GetOrCreateAsync(key, create);
9088

91-
id = rawdb._random.Next(1, 10001);
89+
id = Random.Shared.Next(1, 10001);
9290
idParameter.TypedValue = id;
9391
key = cacheKeys[id];
9492
}
@@ -136,7 +134,7 @@ public async Task<World[]> LoadMultipleQueriesRows(int count)
136134
batch.BatchCommands.Add(new()
137135
{
138136
CommandText = "SELECT id, randomnumber FROM world WHERE id = $1",
139-
Parameters = { new NpgsqlParameter<int> { TypedValue = _random.Next(1, 10001) } }
137+
Parameters = { new NpgsqlParameter<int> { TypedValue = Random.Shared.Next(1, 10001) } }
140138
});
141139
}
142140

@@ -165,7 +163,7 @@ public async Task<World[]> LoadMultipleQueriesRows(int count)
165163
for (var i = 0; i < results.Length; i++)
166164
{
167165
results[i] = await ReadSingleRow(cmd);
168-
idParameter.TypedValue = _random.Next(1, 10001);
166+
idParameter.TypedValue = Random.Shared.Next(1, 10001);
169167
}
170168

171169
return results;
@@ -175,24 +173,30 @@ public async Task<World[]> LoadMultipleQueriesRows(int count)
175173
public async Task<World[]> LoadMultipleUpdatesRows(int count)
176174
{
177175
var results = new World[count];
176+
var ids = new int[count];
178177

179178
using var connection = CreateConnection();
180179
await connection.OpenAsync();
181180

182-
#if NET7_0_OR_GREATER
183181
using (var batch = new NpgsqlBatch(connection))
184182
{
185183
// Inserts a PG Sync message between each statement in the batch, required for compliance with
186184
// TechEmpower general test requirement 7
187185
// https://github.com/TechEmpower/FrameworkBenchmarks/wiki/Project-Information-Framework-Tests-Overview
188186
batch.EnableErrorBarriers = true;
189187

188+
for (var i = 0; i < count; i++)
189+
{
190+
ids[i] = Random.Shared.Next(1, 10001);
191+
}
192+
Array.Sort(ids);
193+
190194
for (var i = 0; i < count; i++)
191195
{
192196
batch.BatchCommands.Add(new()
193197
{
194198
CommandText = "SELECT id, randomnumber FROM world WHERE id = $1",
195-
Parameters = { new NpgsqlParameter<int> { TypedValue = _random.Next(1, 10001) } }
199+
Parameters = { new NpgsqlParameter<int> { TypedValue = ids[i] } }
196200
});
197201
}
198202

@@ -205,32 +209,20 @@ public async Task<World[]> LoadMultipleUpdatesRows(int count)
205209
await reader.NextResultAsync();
206210
}
207211
}
208-
#else
209-
var (queryCmd, queryParameter) = CreateReadCommand(connection);
210-
using (queryCmd)
211-
{
212-
for (var i = 0; i < results.Length; i++)
213-
{
214-
results[i] = await ReadSingleRow(queryCmd);
215-
queryParameter.TypedValue = _random.Next(1, 10001);
216-
}
217-
}
218-
#endif
219212

220-
using (var updateCmd = new NpgsqlCommand(BatchUpdateString.Query(count), connection))
213+
var numbers = new int[count];
214+
for (var i = 0; i < count; i++)
221215
{
222-
for (var i = 0; i < results.Length; i++)
223-
{
224-
var randomNumber = _random.Next(1, 10001);
216+
numbers[i] = Random.Shared.Next(1, 10001);
217+
}
225218

226-
updateCmd.Parameters.Add(new NpgsqlParameter<int> { TypedValue = results[i].Id });
227-
updateCmd.Parameters.Add(new NpgsqlParameter<int> { TypedValue = randomNumber });
219+
var update = "UPDATE world w SET randomnumber = u.new_val FROM (SELECT unnest($1) as id, unnest($2) as new_val) u WHERE w.id = u.id";
228220

229-
results[i].RandomNumber = randomNumber;
230-
}
221+
using var updateCmd = new NpgsqlCommand(update, connection);
222+
updateCmd.Parameters.AddWithValue("id", ids);
223+
updateCmd.Parameters.AddWithValue("new_val", numbers);
231224

232-
await updateCmd.ExecuteNonQueryAsync();
233-
}
225+
await updateCmd.ExecuteNonQueryAsync();
234226

235227
return results;
236228
}
@@ -293,7 +285,7 @@ public Task<List<FortuneUtf8>> LoadFortunesRowsNoDb()
293285
private (NpgsqlCommand readCmd, NpgsqlParameter<int> idParameter) CreateReadCommand(NpgsqlConnection connection)
294286
{
295287
var cmd = new NpgsqlCommand("SELECT id, randomnumber FROM world WHERE id = $1", connection);
296-
var parameter = new NpgsqlParameter<int> { TypedValue = _random.Next(1, 10001) };
288+
var parameter = new NpgsqlParameter<int> { TypedValue = Random.Shared.Next(1, 10001) };
297289

298290
cmd.Parameters.Add(parameter);
299291

src/BenchmarksApps/TechEmpower/PlatformBenchmarks/Program.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ public static IWebHost BuildWebHost(string[] args)
7373

7474
if (appSettings.Database == DatabaseServer.PostgreSql)
7575
{
76-
BenchmarkApplication.RawDb = new RawDb(new ConcurrentRandom(), appSettings);
76+
BenchmarkApplication.RawDb = new RawDb(appSettings);
7777
BenchmarkApplication.DapperDb = new DapperDb(appSettings);
7878
BenchmarkApplication.EfDb = new EfDb(appSettings);
7979
}

0 commit comments

Comments
 (0)