@@ -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
0 commit comments