Compare commits

...

8 Commits

Author SHA1 Message Date
a889a9f0b8 up
All checks were successful
/ build (push) Successful in 1m23s
2025-06-22 16:32:50 +02:00
71fc44acc5 change provider
All checks were successful
/ build (push) Successful in 42s
2025-04-01 22:09:36 +02:00
36cd9266b3 remove links
All checks were successful
/ build (push) Successful in 3m55s
2025-04-01 22:04:13 +02:00
21ff0825cc up python
All checks were successful
/ build (push) Successful in 37s
2025-03-04 20:07:53 +01:00
c7cdd65f87 add link
All checks were successful
/ build (push) Successful in 3m51s
2025-03-03 20:37:47 +01:00
3b2adea40f up ver
All checks were successful
/ build (push) Successful in 34s
2025-03-02 22:21:00 +01:00
8e82c90734 use python asyncio
All checks were successful
/ build (push) Successful in 43s
2025-03-02 22:19:41 +01:00
ea7529c443 cleanup asp deps
All checks were successful
/ build (push) Successful in 35s
2025-03-02 22:05:30 +01:00
9 changed files with 142 additions and 148 deletions

View File

@ -18,7 +18,7 @@ I can develop proper API design following [**DDD / Hexa**](https://en.wikipedia.
I encourage `TDD` or at least proper **integration tests** on any backend frameworks, following **AAA** aka *Arrange Act Assert* principle :
* `PHPUnit` or [`Pest`](https://pestphp.com/) for *PHP*
* [`NUnit.net`](https://nunit.org/) or [`xUnit.net`](https://xunit.net/) with [`Fluent Assertions`](https://github.com/fluentassertions/fluentassertions) for *.NET Core*
* [`NUnit.net`](https://nunit.org/) or [`xUnit.net`](https://xunit.net/) for *.NET Core*
* `JUnit` with [`REST Assured`](https://rest-assured.io/) for *Spring Boot*
* `Jest` and `pytest` on respective *NodeJS* end *Python* stacks

View File

@ -8,7 +8,5 @@ Main packages involved :
* [Fluent Validation](https://fluentvalidation.net/) for strongly typed validation
* [dotnet-format](https://github.com/dotnet/format) as official formatter
* [xUnit.net](https://xunit.net/) as framework test
* [Fluent Assertions](https://fluentassertions.com/) for strongly typed assertions within the API
* [Respawn](https://github.com/jbogard/Respawn) as for optimal integration tests isolation
* [Bogus](https://github.com/bchavez/Bogus) for strongly typed fake data generator
* [Bullseye](https://github.com/adamralph/bullseye) as a nice CLI publisher tool with dependency graph

View File

@ -9,7 +9,7 @@ We'll be comparing the read performance of 6 Web APIs frameworks, sharing the sa
{{< /lead >}}
{{< alert >}}
Update April 2024 for PHP: I replaced previous Apache results by new [FrankenPHP](https://frankenphp.dev/). Now PHP is back in the game, with huge performance increase thanks to worker mode.
Outdated post, check the [lastest]({{< ref "/posts/23-web-api-benchmarks-2025" >}}) for updated benchs.
{{< /alert >}}
This is not a basic synthetic benchmark, but a real world benchmark with DB data tests, and multiple scenarios. This post may be updated when new versions of frameworks will be released or any suggestions for performance related improvement in below commentary section.

View File

@ -12,10 +12,10 @@ This is a 2025 update from previous [2024 benchmark]({{< ref "/posts/22-web-api-
| Framework & Source code | Runtime | ORM |
| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------- | -------------- |
| [Laravel 11](https://github.com/adr1enbe4udou1n/laravel-realworld-example-app) ([api](https://laravelrealworld.okami101.io/api/) / [image](https://gitea.okami101.io/conduit/-/packages/container/laravel/latest)) | FrankenPHP 8.4 | Eloquent |
| [Laravel 12](https://github.com/adr1enbe4udou1n/laravel-realworld-example-app) ([api](https://laravelrealworld.okami101.io/api/) / [image](https://gitea.okami101.io/conduit/-/packages/container/laravel/latest)) | FrankenPHP 8.4 | Eloquent |
| [Symfony 7.2](https://github.com/adr1enbe4udou1n/symfony-realworld-example-app) ([api](https://symfonyrealworld.okami101.io/api/) / [image](https://gitea.okami101.io/conduit/-/packages/container/symfony/latest)) | FrankenPHP 8.4 | Doctrine |
| [FastAPI](https://github.com/adr1enbe4udou1n/fastapi-realworld-example-app) ([api](https://fastapirealworld.okami101.io/api/) / [image](https://gitea.okami101.io/conduit/-/packages/container/fastapi/latest)) | Python 3.13 | SQLAlchemy 2.0 |
| [NestJS 10](https://github.com/adr1enbe4udou1n/nestjs-realworld-example-app) ([api](https://nestjsrealworld.okami101.io/api/) / [image](https://gitea.okami101.io/conduit/-/packages/container/nestjs/latest)) | Node 22 | Prisma 6 |
| [FastAPI](https://github.com/adr1enbe4udou1n/fastapi-realworld-example-app) ([api](https://fastapirealworld.okami101.io/api/) / [image](https://gitea.okami101.io/conduit/-/packages/container/fastapi/latest)) | Python 3.13 (asyncio) | SQLAlchemy 2.0 (asyncio) |
| [NestJS 11](https://github.com/adr1enbe4udou1n/nestjs-realworld-example-app) ([api](https://nestjsrealworld.okami101.io/api/) / [image](https://gitea.okami101.io/conduit/-/packages/container/nestjs/latest)) | Node 22 | Prisma 6 |
| [Spring Boot 3.4](https://github.com/adr1enbe4udou1n/spring-boot-realworld-example-app) ([api](https://springbootrealworld.okami101.io/api/) / [image](https://gitea.okami101.io/conduit/-/packages/container/spring-boot/latest)) | Java 21 | Hibernate 6 |
| [ASP.NET Core 9](https://github.com/adr1enbe4udou1n/aspnetcore-realworld-example-app) ([api](https://aspnetcorerealworld.okami101.io/api/) / [image](https://gitea.okami101.io/conduit/-/packages/container/aspnet-core/latest)) | .NET 9.0 | EF Core 9 |
@ -147,6 +147,7 @@ services:
- DB_PASSWORD=okami
- DB_DATABASE=conduit_fastapi
- JWT_PASSPHRASE=c2b344e1-1a20-47fc-9aef-55b0c0d568a7
- UVICORN_WORKERS=2
networks:
- postgres_db
- traefik_public
@ -155,9 +156,9 @@ services:
- traefik.enable=true
- traefik.http.routers.fastapi.entrypoints=websecure
- traefik.http.services.fastapi.loadbalancer.server.port=8000
replicas: 4
replicas: 2
placement:
max_replicas_per_node: 2
max_replicas_per_node: 1
constraints:
- node.labels.run == true
@ -1029,30 +1030,28 @@ Huge gap in performance against Laravel Octane here, about twice better ! Withou
### FastAPI
As a side note here, uvicorn is limited to 1 CPU core, so I use 2 replicas on each worker to use all CPU cores.
#### FastAPI scenario 1
Iteration creation rate = **15/s**
```txt
checks.........................: 100.00% 39678 out of 39678
data_received..................: 321 MB 5.2 MB/s
data_sent......................: 3.4 MB 55 kB/s
dropped_iterations.............: 123 1.983368/s
http_req_blocked...............: avg=23.83µs min=213ns med=799ns max=113.17ms p(90)=1.41µs p(95)=1.59µs
http_req_connecting............: avg=1.42µs min=0s med=0s max=6.53ms p(90)=0s p(95)=0s
http_req_duration..............: avg=69.21ms min=6.41ms med=54.17ms max=382.34ms p(90)=142.86ms p(95)=166.33ms
{ expected_response:true }...: avg=69.21ms min=6.41ms med=54.17ms max=382.34ms p(90)=142.86ms p(95)=166.33ms
http_req_failed................: 0.00% 0 out of 39678
http_req_receiving.............: avg=491.01µs min=23.44µs med=282.51µs max=20.46ms p(90)=1.01ms p(95)=1.6ms
http_req_sending...............: avg=106.95µs min=17.61µs med=85.46µs max=20.9ms p(90)=155.94µs p(95)=189.16µs
http_req_tls_handshaking.......: avg=18.91µs min=0s med=0s max=34.33ms p(90)=0s p(95)=0s
http_req_waiting...............: avg=68.62ms min=6.23ms med=53.56ms max=381.34ms p(90)=142.08ms p(95)=165.56ms
http_reqs......................: 39678 639.805458/s
iteration_duration.............: avg=3.56s min=1s med=3.68s max=5.11s p(90)=4.22s p(95)=4.38s
iterations.....................: 778 12.545205/s
vus............................: 3 min=3 max=50
checks.........................: 100.00% 28764 out of 28764
data_received..................: 234 MB 3.7 MB/s
data_sent......................: 2.6 MB 41 kB/s
dropped_iterations.............: 336 5.300365/s
http_req_blocked...............: avg=39.99µs min=242ns med=669ns max=68.16ms p(90)=1.14µs p(95)=1.32µs
http_req_connecting............: avg=1.66µs min=0s med=0s max=3.75ms p(90)=0s p(95)=0s
http_req_duration..............: avg=103.18ms min=6.22ms med=101.32ms max=452.09ms p(90)=139.92ms p(95)=157.15ms
{ expected_response:true }...: avg=103.18ms min=6.22ms med=101.32ms max=452.09ms p(90)=139.92ms p(95)=157.15ms
http_req_failed................: 0.00% 0 out of 28764
http_req_receiving.............: avg=460.02µs min=28.21µs med=334.44µs max=18.75ms p(90)=862.97µs p(95)=1.19ms
http_req_sending...............: avg=93.58µs min=21.19µs med=79.76µs max=3.26ms p(90)=141.54µs p(95)=167.69µs
http_req_tls_handshaking.......: avg=35.6µs min=0s med=0s max=28.74ms p(90)=0s p(95)=0s
http_req_waiting...............: avg=102.63ms min=5.98ms med=100.76ms max=451.57ms p(90)=139.32ms p(95)=156.56ms
http_reqs......................: 28764 453.749133/s
iteration_duration.............: avg=5.28s min=1.61s med=5.38s max=6.19s p(90)=5.71s p(95)=5.79s
iterations.....................: 564 8.897042/s
vus............................: 17 min=15 max=50
vus_max........................: 50 min=50 max=50
```
@ -1064,13 +1063,13 @@ vus_max........................: 50 min=50 max=50
{
label: 'Req/s',
data: [
205, 686, 625, 657, 643, 684, 625, 652, 606,
656, 610, 662, 672, 687, 647, 650, 636, 663,
665, 617, 600, 621, 637, 655, 628, 681, 649,
637, 662, 568, 669, 667, 630, 625, 630, 685,
654, 647, 667, 631, 618, 656, 614, 695, 650,
659, 629, 638, 646, 609, 642, 661, 647, 677,
601, 662, 665, 608, 671, 628, 632, 629, 150
50, 371, 331, 391, 475, 450, 464, 464, 467, 450,
447, 467, 467, 455, 451, 458, 463, 485, 470, 476,
449, 481, 485, 461, 476, 442, 455, 474, 454, 456,
439, 478, 472, 436, 473, 453, 463, 471, 456, 455,
439, 470, 456, 473, 465, 459, 468, 471, 475, 474,
444, 484, 469, 466, 468, 448, 477, 449, 443, 482,
444, 452, 432, 374, 1
]
}
]
@ -1085,12 +1084,12 @@ vus_max........................: 50 min=50 max=50
{
label: 'VUs',
data: [
15, 18, 22, 30, 31, 36, 37, 41, 49, 50, 49, 50,
47, 48, 47, 48, 49, 47, 49, 44, 47, 48, 48, 50,
46, 46, 45, 50, 48, 47, 45, 50, 45, 49, 45, 45,
50, 47, 48, 50, 47, 50, 46, 47, 49, 47, 50, 47,
50, 46, 49, 46, 47, 49, 48, 49, 47, 47, 48, 49,
38, 3
15, 27, 39, 50, 50, 50, 49, 48, 48, 50, 50, 50,
48, 46, 49, 50, 48, 49, 49, 50, 50, 50, 49, 48,
47, 48, 50, 47, 48, 50, 47, 50, 50, 48, 46, 49,
50, 50, 50, 49, 48, 50, 48, 49, 50, 50, 49, 44,
49, 49, 49, 48, 50, 48, 50, 50, 47, 50, 49, 50,
45, 37, 17
]
}
]
@ -1101,12 +1100,13 @@ vus_max........................: 50 min=50 max=50
{
label: 'Duration (ms)',
data: [
19, 22, 29, 35, 44, 46, 57, 60, 71, 73, 80, 73,
73, 67, 76, 74, 73, 73, 70, 80, 76, 77, 76, 74,
77, 65, 70, 75, 73, 84, 68, 71, 80, 74, 79, 64,
74, 77, 69, 77, 79, 71, 78, 67, 75, 72, 77, 76,
74, 78, 71, 73, 74, 70, 78, 76, 71, 75, 71, 79,
71, 49, 17
21, 34, 77, 93, 102, 110, 107, 104, 105, 109,
112, 106, 105, 103, 106, 107, 106, 103, 103, 102,
108, 103, 102, 107, 103, 109, 106, 106, 107, 108,
112, 103, 103, 111, 105, 107, 105, 104, 107, 107,
115, 103, 108, 103, 107, 108, 105, 102, 101, 104,
112, 102, 105, 104, 105, 110, 104, 106, 108, 105,
111, 102, 85, 47, 8
]
}
]
@ -1120,11 +1120,11 @@ vus_max........................: 50 min=50 max=50
{
label: 'User',
data: [
0.01, 0.48, 0.69, 0.7,
0.69, 0.7, 0.7, 0.69,
0.71, 0.69, 0.68, 0.69,
0.69, 0.41, 0.01, 0.02,
0.01, 0.01
0.02, 0.02, 0.1, 0.74,
0.78, 0.77, 0.79, 0.79,
0.78, 0.78, 0.78, 0.78,
0.78, 0.77, 0.78, 0.36,
0.02, 0.02, 0.02
],
borderColor: '#4bc0c0',
backgroundColor: '#4bc0c0',
@ -1133,11 +1133,11 @@ vus_max........................: 50 min=50 max=50
{
label: 'System',
data: [
0.01, 0.16, 0.26, 0.26,
0.24, 0.24, 0.25, 0.25,
0.26, 0.25, 0.24, 0.24,
0.24, 0.16, 0.01, 0.02,
0.01, 0.01
0.01, 0.01, 0.04, 0.2,
0.21, 0.21, 0.21, 0.2,
0.21, 0.21, 0.21, 0.21,
0.21, 0.22, 0.21, 0.1,
0.02, 0.01, 0.01
],
borderColor: '#ff6384',
backgroundColor: '#ff6384',
@ -1151,11 +1151,11 @@ vus_max........................: 50 min=50 max=50
{
label: 'User',
data: [
0.02, 0.11, 0.46, 0.49,
0.48, 0.5, 0.5, 0.49,
0.48, 0.48, 0.47, 0.49,
0.48, 0.49, 0.05, 0.02,
0.02, 0.02
0.02, 0.02, 0.37, 0.5,
0.5, 0.49, 0.48, 0.5,
0.49, 0.5, 0.49, 0.5,
0.49, 0.5, 0.41, 0.02,
0.03, 0.02, 0.02
],
borderColor: '#4bc0c0',
backgroundColor: '#4bc0c0',
@ -1164,11 +1164,11 @@ vus_max........................: 50 min=50 max=50
{
label: 'System',
data: [
0.02, 0.06, 0.24, 0.35,
0.28, 0.35, 0.33, 0.3,
0.28, 0.32, 0.27, 0.34,
0.29, 0.3, 0.04, 0.02,
0.02, 0.02
0.02, 0.02, 0.33, 0.34,
0.34, 0.33, 0.32, 0.35,
0.34, 0.35, 0.36, 0.33,
0.32, 0.36, 0.33, 0.02,
0.02, 0.02, 0.02
],
borderColor: '#ff6384',
backgroundColor: '#ff6384',
@ -1185,23 +1185,23 @@ vus_max........................: 50 min=50 max=50
Iteration creation rate = **2/s**
```txt
checks.........................: 100.00% 82414 out of 82414
data_received..................: 164 MB 1.8 MB/s
data_sent......................: 6.1 MB 68 kB/s
dropped_iterations.............: 64 0.711058/s
http_req_blocked...............: avg=13.71µs min=208ns med=783ns max=143.23ms p(90)=1.39µs p(95)=1.56µs
http_req_connecting............: avg=1.28µs min=0s med=0s max=25.89ms p(90)=0s p(95)=0s
http_req_duration..............: avg=43.46ms min=3.99ms med=24.29ms max=315.4ms p(90)=108.49ms p(95)=129.33ms
{ expected_response:true }...: avg=43.46ms min=3.99ms med=24.29ms max=315.4ms p(90)=108.49ms p(95)=129.33ms
http_req_failed................: 0.00% 0 out of 82414
http_req_receiving.............: avg=205.46µs min=16.8µs med=103.34µs max=23.42ms p(90)=394.08µs p(95)=591.95µs
http_req_sending...............: avg=94.88µs min=17.56µs med=78.81µs max=14.63ms p(90)=143.76µs p(95)=171.26µs
http_req_tls_handshaking.......: avg=9.75µs min=0s med=0s max=29.89ms p(90)=0s p(95)=0s
http_req_waiting...............: avg=43.16ms min=23.62µs med=23.97ms max=315.14ms p(90)=108.17ms p(95)=129.04ms
http_reqs......................: 82414 915.642582/s
iteration_duration.............: avg=1m5s min=44.88s med=1m10s max=1m14s p(90)=1m13s p(95)=1m13s
iterations.....................: 36 0.39997/s
vus............................: 21 min=2 max=50
checks.........................: 100.00% 72770 out of 72770
data_received..................: 145 MB 1.6 MB/s
data_sent......................: 5.5 MB 61 kB/s
dropped_iterations.............: 66 0.733176/s
http_req_blocked...............: avg=14.03µs min=198ns med=645ns max=144.52ms p(90)=1.11µs p(95)=1.27µs
http_req_connecting............: avg=629ns min=0s med=0s max=5.17ms p(90)=0s p(95)=0s
http_req_duration..............: avg=50.94ms min=3.78ms med=38.97ms max=384.02ms p(90)=107.46ms p(95)=136.98ms
{ expected_response:true }...: avg=50.94ms min=3.78ms med=38.97ms max=384.02ms p(90)=107.46ms p(95)=136.98ms
http_req_failed................: 0.00% 0 out of 72770
http_req_receiving.............: avg=200.09µs min=18.28µs med=107.44µs max=18.54ms p(90)=399.04µs p(95)=632µs
http_req_sending...............: avg=86.57µs min=16.71µs med=73.65µs max=13.95ms p(90)=132.89µs p(95)=158.51µs
http_req_tls_handshaking.......: avg=10.86µs min=0s med=0s max=28.74ms p(90)=0s p(95)=0s
http_req_waiting...............: avg=50.66ms min=3.64ms med=38.7ms max=383.81ms p(90)=107.11ms p(95)=136.61ms
http_reqs......................: 72770 808.381614/s
iteration_duration.............: avg=1m6s min=49.42s med=1m8s max=1m19s p(90)=1m18s p(95)=1m18s
iterations.....................: 18 0.199957/s
vus............................: 37 min=2 max=50
vus_max........................: 50 min=50 max=50
```
@ -1213,15 +1213,14 @@ vus_max........................: 50 min=50 max=50
{
label: 'Req/s',
data: [
12, 155, 362, 681, 799, 914, 973, 975, 984, 928, 959,
964, 934, 975, 874, 924, 883, 908, 931, 888, 983, 935,
967, 959, 898, 942, 939, 935, 933, 904, 926, 909, 911,
904, 945, 929, 990, 962, 973, 896, 998, 962, 930, 983,
891, 1007, 944, 925, 983, 952, 938, 984, 939, 936, 872,
959, 996, 983, 968, 945, 909, 964, 973, 897, 921, 996,
953, 986, 941, 929, 942, 966, 880, 943, 901, 956, 925,
944, 967, 899, 935, 937, 924, 960, 899, 999, 917, 891,
880, 884, 538
734, 921, 803, 822, 870, 809, 859, 751, 834, 825,
786, 779, 811, 928, 869, 802, 802, 802, 832, 802,
798, 824, 768, 845, 825, 762, 860, 758, 812, 813,
808, 783, 772, 797, 831, 835, 799, 781, 844, 824,
787, 801, 769, 819, 799, 774, 837, 776, 837, 826,
821, 776, 791, 816, 838, 792, 900, 795, 815, 807,
781, 819, 729, 848, 861, 839, 872, 762, 796, 902,
790, 791, 791, 830, 815, 835, 832, 583
]
}
]
@ -1236,14 +1235,13 @@ vus_max........................: 50 min=50 max=50
{
label: 'VUs',
data: [
2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24,
26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48,
50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
50, 50, 50, 50, 49, 49, 50, 50, 50, 50, 50, 50,
49, 49, 49, 49, 48, 47, 46, 46, 46, 45, 45, 44,
43, 43, 43, 42, 41, 40, 40, 40, 38, 36, 35, 34,
32, 30, 29, 26, 25, 21
50, 49, 50, 50, 50, 50, 50, 50, 50, 50, 50, 49,
50, 50, 50, 49, 49, 48, 48, 48, 48, 47, 47, 46,
46, 46, 45, 44, 44, 44, 44, 43, 43, 42, 42, 40,
40, 39, 38, 37, 37, 37
]
}
]
@ -1254,14 +1252,13 @@ vus_max........................: 50 min=50 max=50
{
label: 'Duration (ms)',
data: [
20, 14, 12, 9, 10, 11, 12, 14, 16, 19, 21, 23,
26, 27, 32, 32, 36, 38, 38, 44, 41, 45, 46, 47,
54, 52, 51, 55, 54, 55, 54, 55, 54, 55, 53, 54,
49, 53, 51, 56, 50, 52, 53, 51, 55, 50, 53, 53,
49, 53, 53, 50, 53, 53, 57, 50, 52, 49, 52, 54,
54, 52, 50, 53, 54, 49, 49, 47, 49, 49, 47, 45,
50, 47, 47, 45, 44, 44, 41, 45, 42, 41, 39, 36,
38, 31, 33, 32, 31, 28, 24
29, 30, 37, 38, 39, 44, 43, 53, 49, 53, 58, 61,
61, 54, 57, 62, 62, 62, 61, 62, 61, 61, 65, 59,
60, 66, 59, 65, 61, 62, 62, 63, 65, 63, 60, 60,
61, 63, 59, 60, 62, 64, 65, 60, 63, 65, 59, 64,
59, 60, 61, 62, 62, 58, 59, 60, 53, 60, 57, 58,
57, 57, 61, 53, 50, 53, 51, 56, 54, 46, 54, 50,
51, 48, 47, 45, 45, 50
]
}
]
@ -1275,11 +1272,11 @@ vus_max........................: 50 min=50 max=50
{
label: 'User',
data: [
0.01, 0.24, 0.65, 0.68,
0.66, 0.69, 0.68, 0.68,
0.68, 0.69, 0.69, 0.71,
0.69, 0.68, 0.7, 0.7,
0.69, 0.68, 0.65
0.51, 0.71, 0.76, 0.7,
0.72, 0.72, 0.74, 0.77,
0.72, 0.73, 0.75, 0.74,
0.73, 0.78, 0.77, 0.66,
0.76, 0.6, 0.02
],
borderColor: '#4bc0c0',
backgroundColor: '#4bc0c0',
@ -1288,11 +1285,11 @@ vus_max........................: 50 min=50 max=50
{
label: 'System',
data: [
0.01, 0.08, 0.23, 0.26,
0.25, 0.28, 0.27, 0.25,
0.25, 0.25, 0.25, 0.27,
0.28, 0.26, 0.27, 0.28,
0.27, 0.24, 0.24
0.15, 0.2, 0.2, 0.18,
0.19, 0.18, 0.19, 0.2,
0.19, 0.19, 0.19, 0.19,
0.19, 0.19, 0.18, 0.17,
0.2, 0.16, 0.01
],
borderColor: '#ff6384',
backgroundColor: '#ff6384',
@ -1306,11 +1303,11 @@ vus_max........................: 50 min=50 max=50
{
label: 'User',
data: [
0.02, 0.03, 0.24, 0.24,
0.25, 0.26, 0.28, 0.28,
0.29, 0.28, 0.29, 0.28,
0.27, 0.28, 0.29, 0.28,
0.28, 0.27, 0.28
0.42, 0.47, 0.48, 0.51,
0.51, 0.52, 0.49, 0.52,
0.52, 0.52, 0.51, 0.53,
0.51, 0.52, 0.49, 0.5,
0.52, 0.12, 0.03
],
borderColor: '#4bc0c0',
backgroundColor: '#4bc0c0',
@ -1319,11 +1316,11 @@ vus_max........................: 50 min=50 max=50
{
label: 'System',
data: [
0.02, 0.02, 0.13, 0.16,
0.2, 0.23, 0.23, 0.24,
0.26, 0.26, 0.26, 0.23,
0.23, 0.25, 0.24, 0.25,
0.25, 0.23, 0.23
0.15, 0.29, 0.37, 0.44,
0.43, 0.46, 0.42, 0.47,
0.47, 0.45, 0.46, 0.46,
0.41, 0.46, 0.39, 0.39,
0.42, 0.11, 0.02
],
borderColor: '#ff6384',
backgroundColor: '#ff6384',
@ -2291,13 +2288,13 @@ Here are the final req/s results for each framework against PgSQL database.
borderColor: "#0f766e",
backgroundColor: "#0f766e",
data: [
205, 686, 625, 657, 643, 684, 625, 652, 606,
656, 610, 662, 672, 687, 647, 650, 636, 663,
665, 617, 600, 621, 637, 655, 628, 681, 649,
637, 662, 568, 669, 667, 630, 625, 630, 685,
654, 647, 667, 631, 618, 656, 614, 695, 650,
659, 629, 638, 646, 609, 642, 661, 647, 677,
601, 662, 665, 608, 671, 628, 632, 629, 150
50, 371, 331, 391, 475, 450, 464, 464, 467, 450,
447, 467, 467, 455, 451, 458, 463, 485, 470, 476,
449, 481, 485, 461, 476, 442, 455, 474, 454, 456,
439, 478, 472, 436, 473, 453, 463, 471, 456, 455,
439, 470, 456, 473, 465, 459, 468, 471, 475, 474,
444, 484, 469, 466, 468, 448, 477, 449, 443, 482,
444, 452, 432, 374, 1
],
},
{
@ -2388,15 +2385,14 @@ Here are the final req/s results for each framework against PgSQL database.
borderColor: "#0f766e",
backgroundColor: "#0f766e",
data: [
12, 155, 362, 681, 799, 914, 973, 975, 984, 928, 959,
964, 934, 975, 874, 924, 883, 908, 931, 888, 983, 935,
967, 959, 898, 942, 939, 935, 933, 904, 926, 909, 911,
904, 945, 929, 990, 962, 973, 896, 998, 962, 930, 983,
891, 1007, 944, 925, 983, 952, 938, 984, 939, 936, 872,
959, 996, 983, 968, 945, 909, 964, 973, 897, 921, 996,
953, 986, 941, 929, 942, 966, 880, 943, 901, 956, 925,
944, 967, 899, 935, 937, 924, 960, 899, 999, 917, 891,
880, 884, 538
734, 921, 803, 822, 870, 809, 859, 751, 834, 825,
786, 779, 811, 928, 869, 802, 802, 802, 832, 802,
798, 824, 768, 845, 825, 762, 860, 758, 812, 813,
808, 783, 772, 797, 831, 835, 799, 781, 844, 824,
787, 801, 769, 819, 799, 774, 837, 776, 837, 826,
821, 776, 791, 816, 838, 792, 900, 795, 815, 807,
781, 819, 729, 848, 861, 839, 872, 762, 796, 902,
790, 791, 791, 830, 815, 835, 832, 583
],
},
{

View File

@ -70,11 +70,8 @@
title: Vuetify Admin
date: 11/2020
repo: okami101/vuetify-admin
demo: https://va-demo.okami101.io/
docs: https://www.okami101.io/vuetify-admin
- name: laravel-rad-stack
title: Laravel RAD Stack
date: 10/2021
repo: adr1enbe4udou1n/laravel-rad-stack
demo: https://laravel-rad-stack.okami101.io/

View File

@ -74,8 +74,8 @@
{{ end }}
<div class="flex items-center justify-between">
<div class="flex items-center gap-4">
<img src="/kube.png" width="30" height="30" alt="Kubernetes"
title="Run on K3s over Hetzner Cloud" />
<img src="/talos-logo.svg" width="30" height="30" alt="Talos Linux"
title="Run on Talos Linux over Hetzner Cloud" />
</div>
<div class="hidden lg:block">
{{/* Copyright */}}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

3
static/talos-logo.svg Normal file
View File

@ -0,0 +1,3 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 203.74 226.05"><defs><style>.cls-1{fill:url(#linear-gradient);}.cls-2{fill:url(#linear-gradient-2);}.cls-3{fill:url(#linear-gradient-3);}.cls-4{fill:url(#linear-gradient-4);}.cls-5{fill:url(#linear-gradient-5);}</style><linearGradient id="linear-gradient" x1="101.85" y1="-15.19" x2="101.85" y2="237.81" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ffd200"/><stop offset="0.06" stop-color="#ffb500"/><stop offset="0.14" stop-color="#ff8c00"/><stop offset="0.21" stop-color="#ff7300"/><stop offset="0.26" stop-color="#ff6a00"/><stop offset="0.33" stop-color="#fc4f0e"/><stop offset="0.43" stop-color="#f92f1e"/><stop offset="0.51" stop-color="#f81b27"/><stop offset="0.57" stop-color="#f7142b"/><stop offset="0.68" stop-color="#df162e"/><stop offset="0.79" stop-color="#af1a38"/><stop offset="1" stop-color="#4b214c"/></linearGradient><linearGradient id="linear-gradient-2" x1="24.84" y1="-15.19" x2="24.84" y2="237.81" xlink:href="#linear-gradient"/><linearGradient id="linear-gradient-3" x1="178.9" y1="-15.19" x2="178.9" y2="237.81" xlink:href="#linear-gradient"/><linearGradient id="linear-gradient-4" x1="145.06" y1="-15.19" x2="145.06" y2="237.81" xlink:href="#linear-gradient"/><linearGradient id="linear-gradient-5" x1="58.64" y1="-15.19" x2="58.64" y2="237.81" xlink:href="#linear-gradient"/></defs><g id="Layer_2" data-name="Layer 2"><g id="Layer_1-2" data-name="Layer 1"><path class="cls-1" d="M101.89,226.05c2.85,0,5.67-.15,8.46-.35V.35c-2.8-.21-5.62-.35-8.48-.35s-5.7.14-8.52.35V225.69c2.81.21,5.64.35,8.5.36Z"/><path class="cls-2" d="M11.56,50.9,9.12,48.47A112.82,112.82,0,0,0,.2,63.61c29.42,29.89,32.52,44.31,32.48,49.14C32.57,125,17.58,144.21,0,162a113.69,113.69,0,0,0,8.84,15.15c1-1,1.95-1.92,2.92-2.9,25.37-25.54,37.77-45.61,37.92-61.38S37.36,77,11.56,50.9Z"/><path class="cls-3" d="M192,174.29l2.92,2.9A113.69,113.69,0,0,0,203.74,162c-17.57-17.83-32.56-37.09-32.68-49.29-.11-11.9,14.79-31.15,32.46-49.18a112.88,112.88,0,0,0-8.9-15.1l-2.44,2.43c-25.8,26.05-38.27,46.34-38.12,62S166.61,148.75,192,174.29Z"/><path class="cls-4" d="M140.68,112.83c0-22,9.81-58.58,24.92-93.15A113,113,0,0,0,150.45,11c-16.54,37.27-26.78,76.91-26.78,101.87,0,24.15,11.09,64.23,27.93,101.7a113,113,0,0,0,14.84-8.77C150.85,170.73,140.68,134.07,140.68,112.83Z"/><path class="cls-5" d="M80,112.83C80,87.74,69.35,47.88,53,11.07a112.76,112.76,0,0,0-14.93,8.64C53.21,54.26,63,90.85,63,112.83c0,21.23-10.17,57.88-25.76,92.91a113.66,113.66,0,0,0,14.84,8.77C68.94,177.05,80,137,80,112.83Z"/></g></g></svg>

After

Width:  |  Height:  |  Size: 2.7 KiB