@@ -15,23 +15,53 @@ namespace BenchmarkRunner.Benchmarks;
1515[ CategoriesColumn ]
1616public class MysqlWriteBenchmark
1717{
18- private readonly string _connectionString = Config . GetMysqlConnectionString ( ) ;
19- private QuerySql _sqlcImpl = null ! ;
20- private Queries _efCoreImpl = null ! ;
18+ private static readonly string _connectionString = Config . GetMysqlConnectionString ( ) ;
19+ private readonly QuerySql _sqlcImpl = new ( _connectionString ) ;
20+ private readonly Queries _efCoreImpl = new ( new SalesDbContext ( _connectionString ) , useTracking : false ) ;
2121 private List < QuerySql . AddOrderItemsArgs > _testOrderItems = null ! ;
22+ private static bool _isInitialized = false ;
23+ private static readonly SemaphoreSlim _initLock = new ( 1 , 1 ) ;
2224
23- [ Params ( 2000000 ) ]
25+ [ Params ( WriteBenchmarkConsts . TotalRecords ) ]
2426 public int TotalRecords { get ; set ; }
2527
2628 [ Params ( 100 , 500 , 1000 ) ]
2729 public int BatchSize { get ; set ; }
2830
2931 [ GlobalSetup ]
30- public void GlobalSetup ( )
32+ public async Task GlobalSetup ( )
3133 {
32- _sqlcImpl = new QuerySql ( _connectionString ) ;
33- _efCoreImpl = new Queries ( new SalesDbContext ( _connectionString ) , useTracking : false ) ;
34- PrepareTestDataAsync ( ) . GetAwaiter ( ) . GetResult ( ) ;
34+ if ( _isInitialized ) return ;
35+ await _initLock . WaitAsync ( ) ;
36+ try
37+ {
38+ if ( _isInitialized ) return ;
39+
40+ await MysqlDatabaseHelper . CleanupDatabaseAsync ( _connectionString ) ;
41+ var seeder = new MysqlDatabaseSeeder ( _connectionString ) ;
42+ await seeder . SeedAsync (
43+ customerCount : 10 ,
44+ productsPerCategory : 15 ,
45+ ordersPerCustomer : 300 ,
46+ itemsPerOrder : 0
47+ ) ;
48+
49+ var orderIds = await _sqlcImpl . GetOrderIdsAsync ( new QuerySql . GetOrderIdsArgs ( Limit : 1000 ) ) ;
50+ var productIds = await _sqlcImpl . GetProductIdsAsync ( new QuerySql . GetProductIdsArgs ( Limit : 1000 ) ) ;
51+
52+ _testOrderItems = [ .. Enumerable . Range ( 0 , TotalRecords ) . Select ( i => new QuerySql . AddOrderItemsArgs (
53+ OrderId : orderIds [ i % orderIds . Count ] . OrderId ,
54+ ProductId : productIds [ i % productIds . Count ] . ProductId ,
55+ Quantity : Random . Shared . Next ( 1 , 10 ) ,
56+ UnitPrice : ( decimal ) ( Random . Shared . NextDouble ( ) * 100 + 5 )
57+ ) ) ] ;
58+
59+ _isInitialized = true ;
60+ }
61+ finally
62+ {
63+ _initLock . Release ( ) ;
64+ }
3565 }
3666
3767 [ IterationSetup ]
@@ -41,28 +71,6 @@ public void IterationSetup()
4171 Helpers . InvokeGarbageCollection ( ) ;
4272 }
4373
44- private async Task PrepareTestDataAsync ( )
45- {
46- await MysqlDatabaseHelper . CleanupDatabaseAsync ( _connectionString ) ;
47- var seeder = new MysqlDatabaseSeeder ( _connectionString ) ;
48- await seeder . SeedAsync (
49- customerCount : 10 ,
50- productsPerCategory : 15 ,
51- ordersPerCustomer : 300 ,
52- itemsPerOrder : 0
53- ) ;
54-
55- var orderIds = await _sqlcImpl . GetOrderIdsAsync ( new QuerySql . GetOrderIdsArgs ( Limit : 1000 ) ) ;
56- var productIds = await _sqlcImpl . GetProductIdsAsync ( new QuerySql . GetProductIdsArgs ( Limit : 1000 ) ) ;
57-
58- _testOrderItems = [ .. Enumerable . Range ( 0 , TotalRecords ) . Select ( i => new QuerySql . AddOrderItemsArgs (
59- OrderId : orderIds [ i % orderIds . Count ] . OrderId ,
60- ProductId : productIds [ i % productIds . Count ] . ProductId ,
61- Quantity : Random . Shared . Next ( 1 , 10 ) ,
62- UnitPrice : ( decimal ) ( Random . Shared . NextDouble ( ) * 100 + 5 )
63- ) ) ] ;
64- }
65-
6674 [ BenchmarkCategory ( "Write" ) ]
6775 [ Benchmark ( Baseline = true , Description = "SQLC - AddOrderItems" ) ]
6876 public async Task Sqlc_AddOrderItems ( )
@@ -79,11 +87,4 @@ public async Task EFCore_AddOrderItems()
7987 ) ) . ToList ( ) ;
8088 await Helpers . InsertInBatchesAsync ( args , BatchSize , _efCoreImpl . AddOrderItems ) ;
8189 }
82-
83- [ GlobalCleanup ]
84- public async Task GlobalCleanup ( )
85- {
86- await _efCoreImpl . DbContext . DisposeAsync ( ) ;
87- await MysqlDatabaseHelper . CleanupDatabaseAsync ( _connectionString ) ;
88- }
8990}
0 commit comments