1
+ <?php
2
+ // fiberasync_benchmark_corrected.php
3
+
4
+ use Rcalicdan \FiberAsync \Api \AsyncPDO ;
5
+ use Rcalicdan \FiberAsync \PDO \DatabaseConfigFactory ;
6
+ use Rcalicdan \FiberAsync \Promise \Promise ;
7
+
8
+ require 'vendor/autoload.php ' ;
9
+
10
+ // Memory tracking function
11
+ function getMemoryUsage () {
12
+ return [
13
+ 'current ' => memory_get_usage (true ),
14
+ 'peak ' => memory_get_peak_usage (true ),
15
+ 'current_mb ' => round (memory_get_usage (true ) / 1024 / 1024 , 2 ),
16
+ 'peak_mb ' => round (memory_get_peak_usage (true ) / 1024 / 1024 , 2 )
17
+ ];
18
+ }
19
+
20
+ echo "=== FiberAsync MySQL Performance Benchmark === \n\n" ;
21
+
22
+ $ mysqlConfig = DatabaseConfigFactory::mysql ([
23
+ 'host ' => 'localhost ' ,
24
+ 'database ' => 'yo ' ,
25
+ 'username ' => 'hey ' ,
26
+ 'password ' => '1234 ' ,
27
+ 'port ' => 3306 ,
28
+ ]);
29
+
30
+ AsyncPDO::init ($ mysqlConfig , 10 );
31
+
32
+ echo "Warming up connection pool... \n" ;
33
+ run (function () {
34
+ await (AsyncPDO::query ("SELECT 1 " ));
35
+ });
36
+ echo "Warmup completed. \n\n" ;
37
+
38
+ //===========================================
39
+ // TEST 1: Simple Concurrent Queries
40
+ //===========================================
41
+ echo "TEST 1: Simple Concurrent Queries (5 queries) \n" ;
42
+ echo "------------------------------------------------ \n" ;
43
+
44
+ run (function () {
45
+ $ memoryStart = getMemoryUsage ();
46
+ $ startTime = microtime (true );
47
+
48
+ $ promises = [];
49
+ for ($ i = 1 ; $ i <= 5 ; $ i ++) {
50
+ $ promises [] = AsyncPDO::query ("SELECT $ i as test_id, 'FiberAsync Test' as source " )
51
+ ->then (function ($ result ) use ($ i , $ startTime ) {
52
+ $ queryTime = microtime (true ) - $ startTime ;
53
+ echo "FiberAsync Query $ i completed: " . number_format ($ queryTime * 1000 , 1 ) . "ms \n" ;
54
+ return $ result ;
55
+ });
56
+ }
57
+
58
+ $ results = await (Promise::all ($ promises ));
59
+ $ endTime = microtime (true );
60
+ $ memoryEnd = getMemoryUsage ();
61
+
62
+ $ totalTime = $ endTime - $ startTime ;
63
+ $ qps = 5 / $ totalTime ;
64
+
65
+ echo "\nRESULTS: \n" ;
66
+ echo "- Total Time: " . number_format ($ totalTime * 1000 , 1 ) . "ms \n" ;
67
+ echo "- QPS (Queries Per Second): " . number_format ($ qps , 2 ) . "\n" ;
68
+ echo "- Memory Usage: {$ memoryEnd ['current_mb ' ]}MB (Peak: {$ memoryEnd ['peak_mb ' ]}MB) \n" ;
69
+ echo "- Memory Increase: " . ($ memoryEnd ['current_mb ' ] - $ memoryStart ['current_mb ' ]) . "MB \n\n" ;
70
+ });
71
+
72
+ //===========================================
73
+ // TEST 2: High Concurrency Test
74
+ //===========================================
75
+ echo "TEST 2: High Concurrency Test (20 queries) \n" ;
76
+ echo "-------------------------------------------- \n" ;
77
+
78
+ run (function () {
79
+ $ memoryStart = getMemoryUsage ();
80
+ $ startTime = microtime (true );
81
+
82
+ $ promises = [];
83
+ for ($ i = 1 ; $ i <= 20 ; $ i ++) {
84
+ $ promises [] = AsyncPDO::query ("SELECT $ i as query_id, NOW() as timestamp " );
85
+ }
86
+
87
+ $ results = await (Promise::all ($ promises ));
88
+ $ endTime = microtime (true );
89
+ $ memoryEnd = getMemoryUsage ();
90
+
91
+ $ totalTime = $ endTime - $ startTime ;
92
+ $ qps = 20 / $ totalTime ;
93
+
94
+ echo "RESULTS: \n" ;
95
+ echo "- Total Time: " . number_format ($ totalTime * 1000 , 1 ) . "ms \n" ;
96
+ echo "- QPS (Queries Per Second): " . number_format ($ qps , 2 ) . "\n" ;
97
+ echo "- Memory Usage: {$ memoryEnd ['current_mb ' ]}MB (Peak: {$ memoryEnd ['peak_mb ' ]}MB) \n" ;
98
+ echo "- Memory Increase: " . ($ memoryEnd ['current_mb ' ] - $ memoryStart ['current_mb ' ]) . "MB \n\n" ;
99
+ });
100
+
101
+ //===========================================
102
+ // TEST 3: Transaction Test
103
+ //===========================================
104
+ echo "TEST 3: Concurrent Transactions (4 transactions) \n" ;
105
+ echo "------------------------------------------------- \n" ;
106
+
107
+ run (function () {
108
+ // Setup test table
109
+ await (AsyncPDO::execute ("CREATE TABLE IF NOT EXISTS fiberasync_test (
110
+ id INT AUTO_INCREMENT PRIMARY KEY,
111
+ batch_id VARCHAR(50),
112
+ name VARCHAR(100),
113
+ value INT,
114
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
115
+ ) " ));
116
+ await (AsyncPDO::execute ("TRUNCATE TABLE fiberasync_test " ));
117
+
118
+ $ memoryStart = getMemoryUsage ();
119
+ $ startTime = microtime (true );
120
+
121
+ $ promises = [];
122
+ for ($ i = 1 ; $ i <= 4 ; $ i ++) {
123
+ $ promises [] = AsyncPDO::transaction (function ($ pdo ) use ($ i , $ startTime ) {
124
+ $ transactionStart = microtime (true ) - $ startTime ;
125
+ echo "FiberAsync Transaction $ i START: " . number_format ($ transactionStart * 1000 , 1 ) . "ms \n" ;
126
+
127
+ for ($ j = 1 ; $ j <= 3 ; $ j ++) {
128
+ $ stmt = $ pdo ->prepare ("INSERT INTO fiberasync_test (batch_id, name, value) VALUES (?, ?, ?) " );
129
+ $ stmt ->execute (["batch- $ i " , "FiberAsync-Record- $ i- $ j " , $ i * 100 + $ j ]);
130
+ }
131
+
132
+ // Use your library's built-in delay function!
133
+ delay (0.2 ); // 200ms delay
134
+
135
+ $ transactionEnd = microtime (true ) - $ startTime ;
136
+ echo "FiberAsync Transaction $ i END: " . number_format ($ transactionEnd * 1000 , 1 ) . "ms \n" ;
137
+
138
+ return $ i ;
139
+ });
140
+ }
141
+
142
+ $ results = await (Promise::all ($ promises ));
143
+ $ endTime = microtime (true );
144
+ $ memoryEnd = getMemoryUsage ();
145
+
146
+ $ totalTime = $ endTime - $ startTime ;
147
+ $ tps = 4 / $ totalTime ;
148
+
149
+ echo "\nRESULTS: \n" ;
150
+ echo "- Total Time: " . number_format ($ totalTime * 1000 , 1 ) . "ms \n" ;
151
+ echo "- TPS (Transactions Per Second): " . number_format ($ tps , 2 ) . "\n" ;
152
+ echo "- Memory Usage: {$ memoryEnd ['current_mb ' ]}MB (Peak: {$ memoryEnd ['peak_mb ' ]}MB) \n" ;
153
+ echo "- Memory Increase: " . ($ memoryEnd ['current_mb ' ] - $ memoryStart ['current_mb ' ]) . "MB \n\n" ;
154
+
155
+ // Verify transaction results
156
+ $ countResult = await (AsyncPDO::fetchValue ("SELECT COUNT(*) FROM fiberasync_test " ));
157
+ echo "- Records Inserted: $ countResult \n\n" ;
158
+ });
159
+
160
+ //===========================================
161
+ // TEST 4: Stress Test with Delays
162
+ //===========================================
163
+ echo "TEST 4: Stress Test with Processing Delays (10 queries) \n" ;
164
+ echo "-------------------------------------------------------- \n" ;
165
+
166
+ run (function () {
167
+ $ memoryStart = getMemoryUsage ();
168
+ $ startTime = microtime (true );
169
+
170
+ $ delays = [100 , 200 , 300 , 150 , 250 , 180 , 120 , 350 , 80 , 400 ];
171
+ $ promises = [];
172
+
173
+ for ($ i = 1 ; $ i <= 10 ; $ i ++) {
174
+ $ delayMs = $ delays [$ i - 1 ];
175
+ $ promises [] = AsyncPDO::query ("SELECT $ i as query_id, ' $ delayMs' as delay_ms " )
176
+ ->then (function ($ result ) use ($ i , $ delayMs , $ startTime ) {
177
+ $ queryStart = microtime (true ) - $ startTime ;
178
+ echo "FiberAsync Stress Query $ i START: " . number_format ($ queryStart * 1000 , 1 ) . "ms (delay: {$ delayMs }ms) \n" ;
179
+
180
+ delay ($ delayMs / 1000.0 );
181
+
182
+ $ queryEnd = microtime (true ) - $ startTime ;
183
+ echo "FiberAsync Stress Query $ i END: " . number_format ($ queryEnd * 1000 , 1 ) . "ms \n" ;
184
+
185
+ return $ result ;
186
+ });
187
+ }
188
+
189
+ $ results = await (Promise::all ($ promises ));
190
+ $ endTime = microtime (true );
191
+ $ memoryEnd = getMemoryUsage ();
192
+
193
+ $ totalTime = $ endTime - $ startTime ;
194
+ $ qps = 10 / $ totalTime ;
195
+
196
+ echo "\nRESULTS: \n" ;
197
+ echo "- Total Time: " . number_format ($ totalTime * 1000 , 1 ) . "ms \n" ;
198
+ echo "- QPS (Queries Per Second): " . number_format ($ qps , 2 ) . "\n" ;
199
+ echo "- Memory Usage: {$ memoryEnd ['current_mb ' ]}MB (Peak: {$ memoryEnd ['peak_mb ' ]}MB) \n" ;
200
+ echo "- Memory Increase: " . ($ memoryEnd ['current_mb ' ] - $ memoryStart ['current_mb ' ]) . "MB \n\n" ;
201
+
202
+ echo "Expected total delay time (sequential): " . array_sum ($ delays ) . "ms \n" ;
203
+ echo "Actual concurrent time should be ~ " . max ($ delays ) . "ms if truly concurrent \n" ;
204
+ });
205
+
206
+ AsyncPDO::reset ();
207
+
208
+ echo "=== FiberAsync MySQL Benchmark Complete === \n" ;
0 commit comments