88using System . Threading . Tasks ;
99using Microsoft . Extensions . Caching . Memory ;
1010using Npgsql ;
11+ using NpgsqlTypes ;
1112
1213// ReSharper disable UseAwaitUsing
1314
1415namespace PlatformBenchmarks
1516{
1617 public sealed class RawDb
1718 {
18- private readonly ConcurrentRandom _random ;
1919 private readonly MemoryCache _cache
2020 = new ( new MemoryCacheOptions { ExpirationScanFrequency = TimeSpan . FromMinutes ( 60 ) } ) ;
2121
@@ -25,11 +25,10 @@ private readonly MemoryCache _cache
2525 private readonly string _connectionString ;
2626#endif
2727
28- public RawDb ( ConcurrentRandom random , AppSettings appSettings )
28+ public RawDb ( AppSettings appSettings )
2929 {
30- _random = random ;
3130#if NET8_0_OR_GREATER
32- _dataSource = new NpgsqlSlimDataSourceBuilder ( appSettings . ConnectionString ) . Build ( ) ;
31+ _dataSource = new NpgsqlSlimDataSourceBuilder ( appSettings . ConnectionString ) . EnableArrays ( ) . Build ( ) ;
3332#elif NET7_0
3433 _dataSource = NpgsqlDataSource . Create ( appSettings . ConnectionString ) ;
3534#else
@@ -53,10 +52,10 @@ public Task<CachedWorld[]> LoadCachedQueries(int count)
5352 var result = new CachedWorld [ count ] ;
5453 var cacheKeys = _cacheKeys ;
5554 var cache = _cache ;
56- var random = _random ;
55+
5756 for ( var i = 0 ; i < result . Length ; i ++ )
5857 {
59- var id = random . Next ( 1 , 10001 ) ;
58+ var id = Random . Shared . Next ( 1 , 10001 ) ;
6059 var key = cacheKeys [ id ] ;
6160 if ( cache . TryGetValue ( key , out var cached ) )
6261 {
@@ -88,7 +87,7 @@ static async Task<CachedWorld[]> LoadUncachedQueries(int id, int i, int count, R
8887 {
8988 result [ i ] = await rawdb . _cache . GetOrCreateAsync ( key , create ) ;
9089
91- id = rawdb . _random . Next ( 1 , 10001 ) ;
90+ id = Random . Shared . Next ( 1 , 10001 ) ;
9291 idParameter . TypedValue = id ;
9392 key = cacheKeys [ id ] ;
9493 }
@@ -136,7 +135,7 @@ public async Task<World[]> LoadMultipleQueriesRows(int count)
136135 batch . BatchCommands . Add ( new ( )
137136 {
138137 CommandText = "SELECT id, randomnumber FROM world WHERE id = $1" ,
139- Parameters = { new NpgsqlParameter < int > { TypedValue = _random . Next ( 1 , 10001 ) } }
138+ Parameters = { new NpgsqlParameter < int > { TypedValue = Random . Shared . Next ( 1 , 10001 ) } }
140139 } ) ;
141140 }
142141
@@ -165,7 +164,7 @@ public async Task<World[]> LoadMultipleQueriesRows(int count)
165164 for ( var i = 0 ; i < results . Length ; i ++ )
166165 {
167166 results [ i ] = await ReadSingleRow ( cmd ) ;
168- idParameter . TypedValue = _random . Next ( 1 , 10001 ) ;
167+ idParameter . TypedValue = Random . Shared . Next ( 1 , 10001 ) ;
169168 }
170169
171170 return results ;
@@ -176,23 +175,29 @@ public async Task<World[]> LoadMultipleUpdatesRows(int count)
176175 {
177176 var results = new World [ count ] ;
178177
178+ var ids = new int [ count ] ;
179+ for ( var i = 0 ; i < count ; i ++ )
180+ {
181+ ids [ i ] = Random . Shared . Next ( 1 , 10001 ) ;
182+ }
183+ Array . Sort ( ids ) ;
184+
179185 using var connection = CreateConnection ( ) ;
180186 await connection . OpenAsync ( ) ;
181187
182- #if NET7_0_OR_GREATER
183188 using ( var batch = new NpgsqlBatch ( connection ) )
184189 {
185190 // Inserts a PG Sync message between each statement in the batch, required for compliance with
186191 // TechEmpower general test requirement 7
187192 // https://github.com/TechEmpower/FrameworkBenchmarks/wiki/Project-Information-Framework-Tests-Overview
188193 batch . EnableErrorBarriers = true ;
189-
194+
190195 for ( var i = 0 ; i < count ; i ++ )
191196 {
192197 batch . BatchCommands . Add ( new ( )
193198 {
194199 CommandText = "SELECT id, randomnumber FROM world WHERE id = $1" ,
195- Parameters = { new NpgsqlParameter < int > { TypedValue = _random . Next ( 1 , 10001 ) } }
200+ Parameters = { new NpgsqlParameter < int > { TypedValue = ids [ i ] } }
196201 } ) ;
197202 }
198203
@@ -205,32 +210,22 @@ public async Task<World[]> LoadMultipleUpdatesRows(int count)
205210 await reader . NextResultAsync ( ) ;
206211 }
207212 }
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
219213
220- using ( var updateCmd = new NpgsqlCommand ( BatchUpdateString . Query ( count ) , connection ) )
214+ var numbers = new int [ count ] ;
215+ for ( var i = 0 ; i < count ; i ++ )
221216 {
222- for ( var i = 0 ; i < results . Length ; i ++ )
223- {
224- var randomNumber = _random . Next ( 1 , 10001 ) ;
217+ var randomNumber = Random . Shared . Next ( 1 , 10001 ) ;
218+ results [ i ] . RandomNumber = randomNumber ;
219+ numbers [ i ] = randomNumber ;
220+ }
225221
226- updateCmd . Parameters . Add ( new NpgsqlParameter < int > { TypedValue = results [ i ] . Id } ) ;
227- updateCmd . Parameters . Add ( new NpgsqlParameter < int > { TypedValue = randomNumber } ) ;
222+ 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" ;
228223
229- results [ i ] . RandomNumber = randomNumber ;
230- }
224+ using var updateCmd = new NpgsqlCommand ( update , connection ) ;
225+ updateCmd . Parameters . Add ( new NpgsqlParameter < int [ ] > { TypedValue = ids , NpgsqlDbType = NpgsqlDbType . Array | NpgsqlDbType . Integer } ) ;
226+ updateCmd . Parameters . Add ( new NpgsqlParameter < int [ ] > { TypedValue = numbers , NpgsqlDbType = NpgsqlDbType . Array | NpgsqlDbType . Integer } ) ;
231227
232- await updateCmd . ExecuteNonQueryAsync ( ) ;
233- }
228+ await updateCmd . ExecuteNonQueryAsync ( ) ;
234229
235230 return results ;
236231 }
@@ -293,7 +288,7 @@ public Task<List<FortuneUtf8>> LoadFortunesRowsNoDb()
293288 private ( NpgsqlCommand readCmd , NpgsqlParameter < int > idParameter ) CreateReadCommand ( NpgsqlConnection connection )
294289 {
295290 var cmd = new NpgsqlCommand ( "SELECT id, randomnumber FROM world WHERE id = $1" , connection ) ;
296- var parameter = new NpgsqlParameter < int > { TypedValue = _random . Next ( 1 , 10001 ) } ;
291+ var parameter = new NpgsqlParameter < int > { TypedValue = Random . Shared . Next ( 1 , 10001 ) } ;
297292
298293 cmd . Parameters . Add ( parameter ) ;
299294
0 commit comments