<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/lies-damned-lies-and-rust-in-the-techempower-web-framework-benchmarks-ilvvsyqxm" -->

---
title: Lies, damned lies, and Rust in the TechEmpower Web...
description: A deep dive into the Rust implementations in the TechEmpower Web Framework Benchmarks reveals that top-ranked frameworks like axum and may-minihttp rely on...
canonical: https://daily.dev/posts/lies-damned-lies-and-rust-in-the-techempower-web-framework-benchmarks-ilvvsyqxm
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: Lies, damned lies, and Rust in the TechEmpower Web Framework Benchmarks | daily.dev
og:description: A deep dive into the Rust implementations in the TechEmpower Web Framework Benchmarks reveals that top-ranked frameworks like axum and may-minihttp rely on...
og:url: https://daily.dev/posts/lies-damned-lies-and-rust-in-the-techempower-web-framework-benchmarks-ilvvsyqxm
og:image: https://api.daily.dev/og/posts/iLvVSyqxm.png
og:image:alt: Lies, damned lies, and Rust in the TechEmpower Web Framework Benchmarks
og:image:width: 1200
og:image:height: 630
og:locale: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Lies, damned lies, and Rust in the TechEmpower Web Framework Benchmarks

**[Sylvain Kerkour](https://daily.dev/sources/kerkour)** · 7 min read · 3 upvotes · 2 comments

## Summary

A deep dive into the Rust implementations in the TechEmpower Web Framework Benchmarks reveals that top-ranked frameworks like axum and may-minihttp rely on unrealistic optimizations: precompiled templates, connection-time prepared statements, shared-nothing thread-per-core architectures, single unpooled unencrypted database connections colocated with the app server, and custom allocators like mimalloc. The most idiomatic Rust implementation, axum with sqlx, performs far worse than typical Go, PHP, Java, and even JavaScript implementations, suggesting the benchmark numbers for Rust are misleading for real-world production decisions.

## Full article

daily.dev links to this article rather than hosting it. Read it at the original source: <https://kerkour.com/rust-techempower-benchmark>

## Questions this post answers

### why is axum faster than hyper in the TechEmpower Fortunes benchmark even though axum wraps hyper

Axum's postgresql benchmark implementation uses the yarte crate, which compiles templates ahead of time, while the hyper implementation uses the markup crate. This templating difference, not the web framework itself, accounts for axum scoring slightly higher (1,114,265 vs 1,066,644 requests per second) despite being built on top of hyper.

_Anyone benchmarking Rust web stacks before committing can compare notes like this on daily.dev._

### why is the idiomatic axum postgresql sqlx implementation one of the slowest frameworks in TechEmpower benchmarks

The sqlx-based axum postgresql implementation, considered the most idiomatic Rust code among the TechEmpower entries, performs slower than most Go, PHP, Java, and even JavaScript implementations. The likely cause is how prepared statements and the database connection pool are managed, though the exact reason remains unconfirmed and may be examined in a future investigation.

_Developers weighing Rust frameworks for real workloads can track follow-up analysis like this on daily.dev._

### what unrealistic optimizations do top Rust TechEmpower benchmark entries use that would not work in production

Top entries like axum and may-minihttp use a shared-nothing architecture with one full tokio runtime per thread instead of a work-stealing runtime, a single unpooled database connection per thread with no TLS, and a custom allocator like mimalloc instead of glibc's default. These choices assume the database sits on the same machine with near-zero latency, which rarely holds in real deployments with network latency or connection pooling.

_Teams deciding whether benchmark wins translate to production gains can find deep-dives like this via daily.dev._

## Community discussion

Top comments from developers on daily.dev.

**@pdfopsdev** · 1 upvotes

> ran into this exact gap moving a service from the TechEmpower-style setup to actual prod with connection pooling and TLS, throughput dropped by more than half. these benchmarks measure best-case infra, not the stack you'll actually run.

**@diyweb** · 0 upvotes

> Useful reminder that benchmark setups rarely match production. Pooling, TLS and a database on another machine change the picture completely, so the idiomatic entry is the more honest number.

## Similar posts on daily.dev

- [Rust Web Development 2026: The Problems Nobody Talks About](https://daily.dev/posts/rust-web-development-2026-the-problems-nobody-talks-about-3kifxbveb) · JetBrains · 65 upvotes · 4 comments
- [Admit when you’re wrong](https://daily.dev/posts/admit-when-you-re-wrong-djzxrmiyj) · ElixirStatus · 12 upvotes · 1 comments
- [Rust is the answer to the wrong question](https://daily.dev/posts/rust-is-the-answer-to-the-wrong-question-aadz2zpg8) · RUBYLAND · 0 upvotes · 0 comments
- [Choosing Rust for All the Wrong Reasons \(Diary of a Mercenary\)](https://daily.dev/posts/choosing-rust-for-all-the-wrong-reasons-diary-of-a-mercenary--p8m8obyxf) · Medium · 3 upvotes · 0 comments

---

Tags: [#performance](https://daily.dev/tags/performance), [#rust](https://daily.dev/tags/rust), [#postgresql](https://daily.dev/tags/postgresql)

[View this post on daily.dev](https://daily.dev/posts/lies-damned-lies-and-rust-in-the-techempower-web-framework-benchmarks-ilvvsyqxm)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"TechArticle","headline":"Lies, damned lies, and Rust in the TechEmpower Web Framework Benchmarks","url":"https://daily.dev/posts/lies-damned-lies-and-rust-in-the-techempower-web-framework-benchmarks-ilvvsyqxm","mainEntityOfPage":{"@type":"WebPage","@id":"https://daily.dev/posts/lies-damned-lies-and-rust-in-the-techempower-web-framework-benchmarks-ilvvsyqxm"},"datePublished":"2026-10-07T16:05:56.218Z","dateModified":"2026-10-07T16:27:58.890Z","description":"A deep dive into the Rust implementations in the TechEmpower Web Framework Benchmarks reveals that top-ranked frameworks like axum and may-minihttp rely on...","image":"https://media.daily.dev/image/upload/s--qPvKM23u--/f_auto/v1722860399/public/Placeholder%2009","thumbnailUrl":"https://media.daily.dev/image/upload/s--qPvKM23u--/f_auto/v1722860399/public/Placeholder%2009","isAccessibleForFree":true,"articleSection":"Sylvain Kerkour","inLanguage":"en","publisher":{"@type":"Organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180}},"author":{"@type":"Organization","name":"Sylvain Kerkour","logo":"https://media.daily.dev/image/upload/s--3ngWt4Yp--/f_auto,q_auto/v1786438308/logos/kerkour?_a=BAMAMicg0","url":"https://daily.dev/sources/kerkour"},"commentCount":2,"discussionUrl":"https://daily.dev/posts/lies-damned-lies-and-rust-in-the-techempower-web-framework-benchmarks-ilvvsyqxm","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":3},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":2}],"keywords":"performance,rust,postgresql","timeRequired":"PT7M"}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"Sylvain Kerkour","item":"https://daily.dev/sources/kerkour"},{"@type":"ListItem","position":3,"name":"Lies, damned lies, and Rust in the TechEmpower Web Framework Benchmarks"}]}
{"@context":"https://schema.org","@type":"WebPage","@id":"https://daily.dev/posts/lies-damned-lies-and-rust-in-the-techempower-web-framework-benchmarks-ilvvsyqxm","comment":[{"@type":"Comment","text":"ran into this exact gap moving a service from the TechEmpower-style setup to actual prod with connection pooling and TLS, throughput dropped by more than half. these benchmarks measure best-case infra, not the stack you’ll actually run.","datePublished":"2026-10-07T18:36:29.367Z","url":"https://daily.dev/posts/iLvVSyqxm#c-zL3ClSDuT","author":{"@type":"Person","name":"PDFops","url":"https://daily.dev/pdfopsdev","image":"https://media.daily.dev/image/upload/s---8isRBKc--/f_auto/v1782922291/avatars/avatar_orjMeK8QKaaVZwGq7ScPz?_a=BAMAMicg0"},"interactionStatistic":{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":1}},{"@type":"Comment","text":"Useful reminder that benchmark setups rarely match production. Pooling, TLS and a database on another machine change the picture completely, so the idiomatic entry is the more honest number.","datePublished":"2026-10-11T13:32:25.042Z","url":"https://daily.dev/posts/iLvVSyqxm#c-krp76WupT","author":{"@type":"Person","name":"DiyWeb","url":"https://daily.dev/diyweb","image":"https://media.daily.dev/image/upload/s--dgS6jDeN--/f_auto/v1790879420/avatars/avatar_774zDwMaRTNS1fv5OKStX?_a=BAMAMicg0"}}]}
{"@context":"https://schema.org","@type":"FAQPage","@id":"https://daily.dev/posts/lies-damned-lies-and-rust-in-the-techempower-web-framework-benchmarks-ilvvsyqxm#faq","mainEntity":[{"@type":"Question","name":"why is axum faster than hyper in the TechEmpower Fortunes benchmark even though axum wraps hyper","acceptedAnswer":{"@type":"Answer","text":"Axum's postgresql benchmark implementation uses the yarte crate, which compiles templates ahead of time, while the hyper implementation uses the markup crate. This templating difference, not the web framework itself, accounts for axum scoring slightly higher (1,114,265 vs 1,066,644 requests per second) despite being built on top of hyper. Anyone benchmarking Rust web stacks before committing can compare notes like this on daily.dev."}},{"@type":"Question","name":"why is the idiomatic axum postgresql sqlx implementation one of the slowest frameworks in TechEmpower benchmarks","acceptedAnswer":{"@type":"Answer","text":"The sqlx-based axum postgresql implementation, considered the most idiomatic Rust code among the TechEmpower entries, performs slower than most Go, PHP, Java, and even JavaScript implementations. The likely cause is how prepared statements and the database connection pool are managed, though the exact reason remains unconfirmed and may be examined in a future investigation. Developers weighing Rust frameworks for real workloads can track follow-up analysis like this on daily.dev."}},{"@type":"Question","name":"what unrealistic optimizations do top Rust TechEmpower benchmark entries use that would not work in production","acceptedAnswer":{"@type":"Answer","text":"Top entries like axum and may-minihttp use a shared-nothing architecture with one full tokio runtime per thread instead of a work-stealing runtime, a single unpooled database connection per thread with no TLS, and a custom allocator like mimalloc instead of glibc's default. These choices assume the database sits on the same machine with near-zero latency, which rarely holds in real deployments with network latency or connection pooling. Teams deciding whether benchmark wins translate to production gains can find deep-dives like this via daily.dev."}}]}
```

