Skip to content
Written with Claude
IMPORTANT

As you may notice, this page and pretty much the entire website were obviously created with the help of AI. I wonder how you could tell? Was it a big "Written With Claude" badge on every page? I moved it to the top now (with the help of AI of course) to make it even more obvious. There are a few blogposts that were written by me manually, the old-fashioned way, I hope there will be more in the future, and those have a similar "Human Written" badge. This project (not the website), on the other hand, is a very, very different story. It took me more than two years of painstaking and unpaid work in my own free time. A story that, hopefully, I will tell someday. But meanwhile, what would you like me to do? To create a complex documentation website with a bunch of highly technical articles with the help of AI and fake it, to give you an illusion that I also did that manually? Like the half of itnernet is doing at this point? How does that makes any sense? Is that even fair to you? Or maybe to create this website manually, the old-fashioned way, just for you? While working a paid job for a salary, most of you wouldn't even get up in the morning. Would you like me to sing you a song while we're at it? For your personal entertainment? Seriously, get a grip. Do you find this information less valuable because of the way this website was created? I give my best to fix it to keep the information as accurate as possible, and I think it is very accurate at this point. If you find some mistakes, inaccurancies or problems, there is a comment section at the bottom of every page, which I also made with the help of the AI. And I woould very much appreciate if you leave your feedback there. Look, I'm just a guy who likes SQL, that's all. If you don't approve of how this website was constructed and the use of AI tools, I suggest closing this page and never wever coming back. And good riddance. And I would ban your access if I could know how. Thank you for your attention to this matter.

PostgreSQL REST API Benchmark 2026: 14 Frameworks Compared

Benchmark · Performance · January 2026


INFO

I wanted to repeat the benchmark from last year for several big reasons:

  • First and foremost I wanted to make tests realistic and fair as much as possible. Last year tests were done in a hurry and to be honest, something was fisy with those results.
  • Lately, there were some big internal changes in NpgsqlRest, many micro-optimizations and improvements that affected performance.
  • I waanted to add more scenarios, and test different aspects (such as system resource usage which are now included).
  • Some other frameworks also had major updates, so I wanted to see how they compare now.

Other than that, during the developement and explaration of the test project, I found some issues. For example:

  • Pause between tests was way too short. Increaed from 5 to 30 seconds to allow TCP TIME_WAIT sockets to clear, JIT warmup, Garbage Collection, etc.
  • Logging setup was uneven across frameworks, causing some to log to console/file during tests, impacting performance. Now all logging is disabled.

Other then that, I wanted to make the benchmarks as transparent, fair, realistic and accurate as possible. Everyone can check the source code used for tests, and run run themself if desired with their own setup. Also, anyone can suggest improvements or make PRs with new frameworks, optimizations or new test scenarios, and I would very much welcome that. As development of NpgsqlRest continues, I plan to repeat this benchmark from time to time to keep track of performance changes.

What follows is the detailed AI-generated analysis and report of the benchmark results. But you can also skip to summary results table or to conclusion sections directly.

Enjoy!

Following our 2025 benchmark, we've updated our testing with the latest framework versions and expanded our test scenarios. This year's benchmark includes higher concurrency levels (up to 200 VUs), pure HTTP overhead tests (Minimal Baseline), and POST body parsing benchmarks.

What We Tested

All frameworks executed the same PostgreSQL functions. This isolates the framework overhead from database performance - every framework runs identical queries against the same PostgreSQL instance. All functions use generate_series() for constant, predictable database response times with no table I/O.

Test Scenarios:

ScenarioEndpointFunctionDescription
Data Type SerializationGET /api/perf-testperf_testComprehensive test with 23 data types (text, int, numeric, bool, date/time, UUID, JSON, arrays). Returns 1, 10, 100, or 500 records.
Minimal Baseline (new)GET /api/perf-minimalperf_minimalPure HTTP routing overhead. Returns {"status": "ok", "ts": ...} - no parameters, minimal response. Tested at 100, 200, and 500 VUs.
POST Body Parsing (new)POST /api/perf-postperf_postTests JSON request body parsing. Sends nested JSON payload, echoes it back with computed values. Tested at 50 VUs with 10 and 100 records.
Nested JSON (new)GET /api/perf-nestedperf_nestedTests nested object serialization at configurable depth levels.
Large Payload (new)GET /api/perf-large-payloadperf_large_payloadTests chunked transfer and buffer handling with configurable KB-sized responses.
Many Parameters (new)GET /api/perf-many-paramsperf_many_paramsTests query string parsing with 20 parameters of mixed types.

Test Configuration:

  • Load Tool: k6 load testing framework
  • Duration: 60 seconds per test (30 seconds for minimal baseline)
  • Concurrency: 1, 50, 100, and 200 virtual users (VUs) - up to 500 VUs for minimal baseline
  • Environment: All services running in Docker containers on the same host
  • Hardware: Hetzner Cloud CCX33 (General Purpose, x86 AMD) - 8 dedicated vCPUs, 32 GB RAM, 240 GB SSD, 30 TB traffic

Frameworks Tested:

FrameworkLanguageVersion
NpgsqlRest (JIT).NET3.4.7
NpgsqlRest (AOT).NET3.4.7
PostgRESTHaskell14.3
Go (net/http + pgx)Go1.25
Rust (Actix + tokio-postgres)Rust1.91.1
Spring BootJava 244.0.1
.NET Minimal API + Dapper.NET 10-
.NET Minimal API + EF Core.NET 9/10-
FastifyNode.js5.7.1
BunBun1.3.3
SwoolePHP 8.46.0 (extension)
FastAPIPython0.128.0
DjangoPython6.0.1

What's New in This Benchmark

This benchmark introduces several improvements over the previous 2025 benchmark:

Version Updates

FrameworkPrevious VersionNew VersionChanged
NpgsqlRest3.2.23.4.7Yes
PostgREST12.2.814.3Yes
Go1.241.25Yes
Rust1.83.01.91.1Yes
Bun1.1.421.3.3Yes
Fastify5.6.25.7.1Yes
FastAPI0.127.10.128.0Yes
Django6.06.0.1Yes
SwoolePHP 8.4 + Swoole 6.0PHP 8.4 + Swoole 6.0No
Spring BootJava 24 + 4.0.1Java 24 + 4.0.1No
.NET Dapper.NET 10 Preview.NET 10 PreviewNo
.NET EF Core.NET 9 / .NET 10 Preview.NET 9 / .NET 10 PreviewNo

New Test Scenarios

We added five new benchmark scenarios (marked "Yes" in the table above):

  • Minimal Baseline: Reveals true framework HTTP overhead separated from database I/O
  • POST Body Parsing: Measures JSON request deserialization and response serialization
  • Nested JSON: Tests nested object serialization performance
  • Large Payload: Tests chunked transfer and buffer handling
  • Many Parameters: Tests query string parsing with 20 parameters

Additionally, we extended concurrency testing:

  • VU range expanded from 1/50/100 to 1/50/100/200
  • Up to 500 VUs for minimal baseline tests
  • Better reveals framework scaling limits under high load

Infrastructure Changes

  • Resource Monitoring: New per-service CPU and memory tracking during tests
  • JIT Warmup Phase: All frameworks now get a warmup period before benchmarks
  • Extended Sleep Between Tests: 30 seconds between tests for TCP TIME_WAIT clearance
  • Improved Result Aggregation: JSON output for programmatic analysis

Comparing With Previous Results

For detailed comparison with the 2025 benchmark:

Key Findings

Swoole PHP Dominates Large Payload Scenarios

A major shift from 2025: Swoole PHP 6.0 now leads in most scenarios involving larger payloads. At 100 VU with 100 records, Swoole achieves 469.58 req/s - outperforming all competitors. With 500 records, Swoole maintains its lead at 106.88 req/s.

NpgsqlRest Leads High-Concurrency Low-Payload Scenarios

At 100 concurrent users with minimal payload (1 record), NpgsqlRest JIT achieves 4,588 req/s, maintaining its lead in low-latency scenarios. The gap between JIT and AOT versions has narrowed significantly in v3.4.7.

The Top Performers by Scenario

ScenarioLeaderPerformance
1 VU, 1 RecordBun539.91 req/s
100 VU, 1 RecordNpgsqlRest JIT4,588 req/s
100 VU, 100 RecordsSwoole PHP469.58 req/s
100 VU, 500 RecordsSwoole PHP106.88 req/s
Minimal Baseline (pure HTTP)Go20,104 req/s
POST Body ParsingGo9,628 req/s

Performance Tiers at 100 VU, 1 Record

TierFrameworksPerformance Range
EliteNpgsqlRest JIT/AOT, Swoole PHP4,400-4,600 req/s
TopBun, Go, Fastify, Spring Boot4,100-4,400 req/s
High.NET Dapper, Rust3,900-4,100 req/s
Mid.NET EF Core3,400-3,500 req/s
LowerFastAPI, PostgREST, Django1,600-1,850 req/s

What Changed From 2025

Several notable performance shifts:

  1. Swoole PHP improved dramatically - Jumping from mid-tier to top performer in data-heavy scenarios
  2. Bun emerged as single-threaded champion - Best performance at 1 VU across all payload sizes
  3. NpgsqlRest JIT/AOT gap narrowed - AOT now performs nearly identically to JIT in most scenarios
  4. PostgREST improved - Better scaling under high concurrency compared to 2025
  5. Go remains pure HTTP champion - Unmatched at 20,000+ req/s in minimal baseline tests

Scaling Behavior

Framework scaling patterns at increasing concurrency:

Framework1 VU50 VU100 VU200 VUScaling Factor
NpgsqlRest JIT4804,3804,5884,5639.5x
Swoole PHP4714,1604,4234,4859.5x
Bun5404,4214,3774,4198.2x
PostgREST2711,8181,7491,6636.5x

Large Payloads Level the Playing Field

With 500 records at 100 VU, database I/O dominates and the performance gap narrows:

Framework500 Records @ 100 VULatency
Swoole PHP106.88 req/s468ms
Go90.93 req/s550ms
Rust85.79 req/s583ms
NpgsqlRest JIT82.37 req/s607ms
FastAPI25.36 req/s1,977ms

Pure HTTP Overhead (Minimal Baseline)

Testing pure HTTP handling without database access reveals framework overhead:

Framework100 VU200 VU500 VU
Go20,104 req/s20,807 req/s20,573 req/s
NpgsqlRest JIT16,065 req/s17,105 req/s17,015 req/s
.NET Dapper14,764 req/s15,401 req/s15,705 req/s
Spring Boot14,138 req/s14,593 req/s14,435 req/s
Swoole PHP12,042 req/s12,309 req/s12,297 req/s
PostgREST5,410 req/s4,974 req/s5,324 req/s

Go's lightweight HTTP server achieves 20,000+ req/s - nearly 4x faster than PostgREST's pure HTTP overhead.

POST Body Parsing Performance

Testing JSON body parsing adds another dimension:

Framework50 VU, 10 Records50 VU, 100 Records
Go9,629 req/s2,697 req/s
Swoole PHP7,470 req/s2,445 req/s
Spring Boot7,133 req/s1,758 req/s
NpgsqlRest JIT6,101 req/s1,226 req/s
Bun4,028 req/s1,832 req/s
PostgREST3,479 req/s1,156 req/s

Go's efficient JSON parsing maintains its lead, while Bun shows strong performance with larger payloads relative to smaller ones.

Python Frameworks Continue to Struggle

Both FastAPI and Django remain at the bottom in most scenarios:

  • FastAPI at 100 VU with 500 records: 1,977ms average latency
  • Django performs better with data serialization but lags in pure throughput

JIT vs AOT in 2026

NpgsqlRest's JIT and AOT versions now perform nearly identically:

ScenarioJITAOTDifference
100 VU, 1 Record4,588 req/s4,527 req/s1.3%
100 VU, 100 Records377 req/s375 req/s0.5%
Minimal Baseline16,065 req/s15,624 req/s2.8%

For most workloads, the choice between JIT and AOT can now be based on deployment requirements (image size, cold start) rather than performance.

Why Certain Frameworks Excel

Swoole PHP's Rise

Swoole 6.0 brings significant improvements:

  • Coroutine-based async I/O eliminates blocking
  • Efficient memory management for large responses
  • Native PostgreSQL driver optimization

Go's HTTP Dominance

Go's minimal baseline performance (20K+ req/s) demonstrates:

  • Extremely low HTTP parsing overhead
  • Efficient goroutine scheduling
  • Zero-allocation hot paths in net/http

NpgsqlRest's Architecture

NpgsqlRest continues to excel by eliminating layers:

  1. No ORM overhead - Direct PostgreSQL protocol via Npgsql
  2. No routing framework - Endpoints derived from database metadata
  3. No serialization layer - PostgreSQL handles JSON serialization
  4. Efficient connection pooling - Npgsql's built-in pooling

Resource Usage

New in this benchmark: per-service memory and CPU monitoring during test execution.

ServicePeak MemoryAvg MemoryAvg CPU
Go75.94 MB21.35 MB4.84%
Swoole PHP78.99 MB50.92 MB4.49%
Rust168.20 MB43.03 MB3.79%
Bun168.00 MB59.31 MB4.29%
.NET Dapper192.70 MB96.55 MB4.19%
FastAPI198.10 MB133.73 MB4.29%
NpgsqlRest AOT237.80 MB59.84 MB4.30%
.NET 10 EF256.50 MB143.59 MB6.16%
.NET 9 EF276.60 MB133.80 MB6.36%
NpgsqlRest JIT321.30 MB111.41 MB4.42%
Fastify411.40 MB58.96 MB3.68%
Django824.00 MB386.77 MB11.84%
Spring Boot1,010.00 MB806.79 MB5.38%

Key Observations

  • Go has the lowest memory footprint (21 MB average, 76 MB peak)
  • Swoole PHP achieves top-tier performance with minimal resources (51 MB average)
  • NpgsqlRest AOT uses half the memory of JIT (60 MB vs 111 MB average)
  • Spring Boot has the highest memory usage (807 MB average, 1 GB peak)
  • Django has the highest CPU usage (11.84% average)

The full resource monitoring data is available in the stats directory.

Important Note: JSON and Array Type Handling

When interpreting these results, not all frameworks return identical JSON responses. The differences lie in how each framework handles PostgreSQL's JSON, JSONB, and array types.

Frameworkjsonjsonbint[]text[]
NpgsqlRest (JIT/AOT)
.NET EF Core / Dapper
Rust
Fastify
Django
Go
FastAPI
PostgREST⚠️⚠️
Bun⚠️⚠️
Spring Boot⚠️⚠️
Swoole PHP

✅ = Properly parsed as native JSON/array ❌ = Returns raw PostgreSQL text format (string) ⚠️ = Unusual format (wrapped in metadata or array)

Swoole PHP's impressive numbers come with a caveat: JSON/JSONB and array fields require additional client-side parsing.

Conclusion

The 2026 benchmark reveals a more nuanced performance landscape:

  • For low-latency, high-concurrency APIs: NpgsqlRest JIT remains the top choice at 4,588 req/s
  • For data-heavy workloads: Swoole PHP now leads with superior large-payload handling
  • For pure HTTP performance: Go is unmatched at 20,000+ req/s
  • For balanced workloads: Bun, Go, and Fastify offer excellent all-around performance

The "database as API" approach continues to deliver exceptional results. NpgsqlRest requires zero application code - just configuration - while delivering top-tier performance and correct PostgreSQL type handling.

Lines of Code Comparison

Performance isn't everything. Development time, maintainability, and code complexity matter too. Here's how much code each framework requires to implement the same API endpoints:

FrameworkLines of Code
PostgREST14 (config only)
NpgsqlRest21 (config only)
Fastify100
.NET EF116
Bun133
FastAPI136
Spring Boot139
.NET Dapper140
Django203
Swoole PHP216
Rust291
Go347

Go may deliver 20,000+ req/s in pure HTTP tests, but that comes at the cost of writing 347 lines of boilerplate code for basic CRUD operations. Every line of code is a potential bug, a maintenance burden, and development time spent.

NpgsqlRest and PostgREST take a different approach: define your API in the database, configure once, and let the framework handle the rest. You get top-tier performance (4,500+ req/s) with just 14-21 lines of configuration - no serialization code, no routing logic, no connection pool management.

The benchmark source code and detailed results are available in the pg_function_load_tests repository.


Full Benchmark Results

Summary Tables

All results in requests per second (req/s). Sorted by 100/1 performance.

Data Type Serialization

Function: perf_test

Framework1/11/10100/1100/100100/500
NpgsqlRest JIT480265🥇 4,58837782
NpgsqlRest AOT466262🥈 4,52737582
Swoole PHP471🥇 292🥉 4,423🥇 470🥇 107
Bun🥇 5402434,37735379
Go🥉 484🥈 2894,362🥈 406🥈 91
Fastify4822604,17235173
Spring Boot4642334,14728261
.NET Dapper4252444,10133172
Rust🥈 507🥉 2853,940🥉 388🥉 86
.NET 10 EF3772203,51533172
.NET 9 EF3622233,42533072
FastAPI4782201,84311125
PostgREST2711811,74934279
Django2711781,69130771

Column headers = VU/Records (e.g., 100/1 = 100 VU, 1 record). See detailed results.

New Scenarios

FrameworkMinPOSTNestLargeParams
Go🥇 20,104🥇 9,629🥇 3,756🥇 1,618🥇 16,100
NpgsqlRest JIT🥈 16,0656,1013,0611,096🥈 11,504
NpgsqlRest AOT🥉 15,6246,065🥉 3,073919🥉 11,221
.NET Dapper14,7646,0892,9891,39710,702
Spring Boot14,138🥉 7,1332,230🥈 1,51510,324
Swoole PHP12,042🥈 7,470🥈 3,426🥉 1,5009,458
Rust11,7615,4002,8241,5099,231
.NET 10 EF9,3854,8792,6151,3147,452
.NET 9 EF8,9894,7102,5581,3267,182
Fastify8,8994,6312,9211,2487,711
Bun7,8034,0282,2871,2353,116
PostgREST5,4103,4791,9129083,960
FastAPI4,0902,4879711,4922,080
Django2,5352,2661,6771,0712,222

Results are grouped by concurrency level and payload size, sorted by requests per second (highest first).

Data Type Serialization Tests

1 Virtual User, 1 Record

Function: perf_test

FrameworkRequests/sAvg LatencyTotal RequestsSummarySource
bun-app-v1.3.3539.91/s1.84ms32,395summarysource
rust-app-v1.91.1506.53/s1.96ms30,392summarysource
go-app-v1.25483.79/s2.05ms29,028summarysource
fastify-app-v5.7.1481.94/s2.06ms28,917summarysource
npgsqlrest-jit-v3.4.7480.28/s2.07ms28,817summarysource
fastapi-app-v0.128.0478.18/s2.08ms28,692summarysource
swoole-php-app-v6.0471.18/s2.11ms28,272summarysource
npgsqlrest-aot-v3.4.7466.06/s2.13ms27,964summarysource
java24-spring-boot-v4.0.1464.36/s2.14ms27,863summarysource
net10-minapi-dapper-jit425.45/s2.34ms25,527summarysource
net10-minapi-ef-jit376.73/s2.64ms22,604summarysource
net9-minapi-ef-jit361.52/s2.75ms21,692summarysource
postgrest-v14.3271.38/s3.67ms16,284summarysource
django-app-v6.0.1270.87/s3.68ms16,254summarysource

1 Virtual User, 10 Records

Function: perf_test

FrameworkRequests/sAvg LatencyTotal RequestsSummarySource
swoole-php-app-v6.0291.51/s3.42ms17,491summarysource
go-app-v1.25288.60/s3.45ms17,317summarysource
rust-app-v1.91.1284.94/s3.50ms17,098summarysource
npgsqlrest-jit-v3.4.7264.71/s3.76ms15,883summarysource
npgsqlrest-aot-v3.4.7262.37/s3.80ms15,743summarysource
fastify-app-v5.7.1259.77/s3.84ms15,587summarysource
net10-minapi-dapper-jit244.13/s4.08ms14,649summarysource
bun-app-v1.3.3243.23/s4.10ms14,594summarysource
java24-spring-boot-v4.0.1232.71/s4.28ms13,964summarysource
net9-minapi-ef-jit223.13/s4.47ms13,389summarysource
fastapi-app-v0.128.0220.40/s4.52ms13,225summarysource
net10-minapi-ef-jit219.98/s4.53ms13,200summarysource
postgrest-v14.3180.58/s5.52ms10,835summarysource
django-app-v6.0.1178.29/s5.59ms10,698summarysource

100 Virtual Users, 1 Record

Function: perf_test

FrameworkRequests/sAvg LatencyTotal RequestsSummarySource
npgsqlrest-jit-v3.4.74,588.02/s10.88ms275,381summarysource
npgsqlrest-aot-v3.4.74,526.64/s11.02ms271,720summarysource
swoole-php-app-v6.04,423.22/s11.29ms265,603summarysource
bun-app-v1.3.34,377.29/s11.41ms262,711summarysource
go-app-v1.254,362.06/s11.44ms261,787summarysource
fastify-app-v5.7.14,171.93/s11.97ms250,370summarysource
java24-spring-boot-v4.0.14,146.96/s12.03ms248,882summarysource
net10-minapi-dapper-jit4,100.54/s12.17ms246,098summarysource
rust-app-v1.91.13,939.83/s12.67ms236,565summarysource
net10-minapi-ef-jit3,515.31/s14.20ms210,977summarysource
net9-minapi-ef-jit3,424.67/s14.60ms205,781summarysource
fastapi-app-v0.128.01,842.81/s27.12ms110,610summarysource
postgrest-v14.31,749.07/s28.58ms105,038summarysource
django-app-v6.0.11,690.72/s29.56ms101,545summarysource

100 Virtual Users, 100 Records

Function: perf_test

FrameworkRequests/sAvg LatencyTotal RequestsSummarySource
swoole-php-app-v6.0469.58/s106.44ms28,257summarysource
go-app-v1.25405.52/s123.21ms24,378summarysource
rust-app-v1.91.1387.70/s128.79ms23,313summarysource
npgsqlrest-jit-v3.4.7377.42/s132.43ms22,691summarysource
npgsqlrest-aot-v3.4.7374.57/s133.40ms22,519summarysource
bun-app-v1.3.3352.79/s141.70ms21,217summarysource
fastify-app-v5.7.1351.07/s142.62ms21,212summarysource
postgrest-v14.3342.26/s145.93ms20,578summarysource
net10-minapi-ef-jit331.31/s151.40ms19,994summarysource
net10-minapi-dapper-jit331.16/s150.92ms19,914summarysource
net9-minapi-ef-jit329.64/s151.67ms19,836summarysource
django-app-v6.0.1307.22/s162.61ms18,480summarysource
java24-spring-boot-v4.0.1281.56/s177.62ms16,949summarysource
fastapi-app-v0.128.0111.17/s449.98ms6,774summarysource

100 Virtual Users, 500 Records

Function: perf_test

FrameworkRequests/sAvg LatencyTotal RequestsSummarySource
swoole-php-app-v6.0106.88/s468.22ms6,459summarysource
go-app-v1.2590.93/s550.42ms5,511summarysource
rust-app-v1.91.185.79/s583.48ms5,192summarysource
npgsqlrest-jit-v3.4.782.37/s606.96ms4,991summarysource
npgsqlrest-aot-v3.4.781.89/s610.99ms4,956summarysource
postgrest-v14.378.59/s636.29ms4,753summarysource
bun-app-v1.3.378.55/s637.59ms4,772summarysource
fastify-app-v5.7.173.00/s685.34ms4,463summarysource
net10-minapi-dapper-jit72.42/s691.80ms4,391summarysource
net9-minapi-ef-jit72.00/s694.45ms4,355summarysource
net10-minapi-ef-jit71.98/s694.12ms4,363summarysource
django-app-v6.0.171.16/s702.86ms4,302summarysource
java24-spring-boot-v4.0.160.75/s822.37ms3,683summarysource
fastapi-app-v0.128.025.36/s1,977.30ms1,613summarysource

Minimal Baseline (Pure HTTP Overhead)

100 Virtual Users

Function: perf_minimal

FrameworkRequests/sAvg LatencyTotal RequestsSummarySource
go-app-v1.2520,104.17/s2.47ms603,258summarysource
npgsqlrest-jit-v3.4.716,064.93/s3.10ms481,990summarysource
npgsqlrest-aot-v3.4.715,623.97/s3.19ms468,869summarysource
net10-minapi-dapper-jit14,763.56/s3.37ms442,970summarysource
java24-spring-boot-v4.0.114,137.76/s3.52ms424,203summarysource
swoole-php-app-v6.012,042.03/s4.13ms361,335summarysource
rust-app-v1.91.111,760.56/s4.22ms352,878summarysource
net10-minapi-ef-jit9,384.73/s5.31ms281,613summarysource
net9-minapi-ef-jit8,988.95/s5.55ms269,715summarysource
fastify-app-v5.7.18,899.19/s5.61ms267,058summarysource
bun-app-v1.3.37,803.09/s6.40ms234,250summarysource
postgrest-v14.35,410.48/s9.23ms162,402summarysource
fastapi-app-v0.128.04,089.65/s12.21ms122,737summarysource
django-app-v6.0.12,535.28/s19.71ms76,114summarysource

POST Body Parsing

50 Virtual Users, 10 Records

Function: perf_post

FrameworkRequests/sAvg LatencyTotal RequestsSummarySource
go-app-v1.259,628.69/s2.58ms577,788summarysource
swoole-php-app-v6.07,470.15/s3.33ms448,231summarysource
java24-spring-boot-v4.0.17,132.74/s3.49ms427,988summarysource
npgsqlrest-jit-v3.4.76,100.82/s4.08ms366,070summarysource
net10-minapi-dapper-jit6,088.58/s4.09ms365,437summarysource
npgsqlrest-aot-v3.4.76,065.30/s4.11ms363,949summarysource
rust-app-v1.91.15,399.96/s4.61ms324,130summarysource
net10-minapi-ef-jit4,879.06/s5.11ms292,761summarysource
net9-minapi-ef-jit4,710.24/s5.29ms282,651summarysource
fastify-app-v5.7.14,631.21/s5.39ms277,906summarysource
bun-app-v1.3.34,027.52/s6.20ms241,687summarysource
postgrest-v14.33,478.73/s7.17ms208,759summarysource
fastapi-app-v0.128.02,487.28/s10.04ms149,259summarysource
django-app-v6.0.12,266.37/s11.02ms136,044summarysource

Nested JSON Serialization

50 Virtual Users, Depth 1

Function: perf_nested

FrameworkRequests/sAvg LatencyTotal RequestsSummarySource
go-app-v1.253,756.41/s6.64ms225,426summarysource
swoole-php-app-v6.03,426.34/s7.27ms205,620summarysource
npgsqlrest-aot-v3.4.73,073.40/s8.12ms184,428summarysource
npgsqlrest-jit-v3.4.73,060.64/s8.15ms183,675summarysource
net10-minapi-dapper-jit2,988.63/s8.35ms179,345summarysource
fastify-app-v5.7.12,921.44/s8.54ms175,319summarysource
rust-app-v1.91.12,824.19/s8.83ms169,476summarysource
net10-minapi-ef-jit2,615.08/s9.54ms156,947summarysource
net9-minapi-ef-jit2,557.86/s9.76ms153,501summarysource
bun-app-v1.3.32,286.95/s10.92ms137,261summarysource
java24-spring-boot-v4.0.12,229.81/s11.19ms133,816summarysource
postgrest-v14.31,912.23/s13.06ms114,792summarysource
django-app-v6.0.11,676.67/s14.90ms100,661summarysource
fastapi-app-v0.128.0970.57/s25.74ms58,262summarysource

Large Payload

25 Virtual Users, 100KB Payload

Function: perf_large_payload

FrameworkRequests/sAvg LatencyTotal RequestsSummarySource
go-app-v1.251,618.26/s7.70ms97,107summarysource
java24-spring-boot-v4.0.11,514.97/s8.23ms90,930summarysource
rust-app-v1.91.11,508.80/s8.27ms90,539summarysource
swoole-php-app-v6.01,500.22/s8.31ms90,027summarysource
fastapi-app-v0.128.01,491.75/s8.36ms89,518summarysource
net10-minapi-dapper-jit1,396.93/s8.93ms83,826summarysource
net9-minapi-ef-jit1,326.18/s9.41ms79,583summarysource
net10-minapi-ef-jit1,313.73/s9.50ms78,847summarysource
fastify-app-v5.7.11,248.43/s10.00ms74,941summarysource
bun-app-v1.3.31,234.55/s10.11ms74,093summarysource
npgsqlrest-jit-v3.4.71,095.93/s11.39ms65,765summarysource
django-app-v6.0.11,070.77/s11.66ms64,270summarysource
npgsqlrest-aot-v3.4.7919.29/s13.58ms55,175summarysource
postgrest-v14.3907.83/s13.75ms54,499summarysource

Many Parameters (20 params)

50 Virtual Users

Function: perf_many_params

FrameworkRequests/sAvg LatencyTotal RequestsSummarySource
go-app-v1.2516,100.46/s1.54ms966,176summarysource
npgsqlrest-jit-v3.4.711,503.53/s2.16ms690,265summarysource
npgsqlrest-aot-v3.4.711,220.54/s2.22ms673,270summarysource
net10-minapi-dapper-jit10,701.77/s2.33ms642,149summarysource
java24-spring-boot-v4.0.110,323.63/s2.41ms619,498summarysource
swoole-php-app-v6.09,457.64/s2.63ms567,509summarysource
rust-app-v1.91.19,230.96/s2.69ms553,984summarysource
fastify-app-v5.7.17,710.72/s3.23ms462,679summarysource
net10-minapi-ef-jit7,452.38/s3.34ms447,165summarysource
net9-minapi-ef-jit7,181.52/s3.47ms430,916summarysource
postgrest-v14.33,960.49/s6.30ms237,672summarysource
bun-app-v1.3.33,116.21/s8.01ms187,044summarysource
django-app-v6.0.12,222.19/s11.24ms133,359summarysource
fastapi-app-v0.128.02,079.91/s12.01ms124,813summarysource

Comments

Released under the MIT License.