<div class="chartlet-wrapper chartlet-responsive chartlet-bp-640"><style>.chartlet-wrapper.chartlet-responsive{display:block;width:100%;container-type:inline-size}.chartlet-variant-mobile{display:none}@container (max-width:639px){.chartlet-bp-640 .chartlet-variant-desktop{display:none}.chartlet-bp-640 .chartlet-variant-mobile{display:block}}</style><figure class="chartlet-figure" data-viz="chart"><figcaption>Web frameworks compared</figcaption><div class="chartlet-variant-desktop"><svg xmlns="http://www.w3.org/2000/svg" width="960" height="420" viewBox="0 0 960 420" id="chartlet-3352392941f81f9a" role="img" aria-labelledby="chartlet-3352392941f81f9a-title chartlet-3352392941f81f9a-description" class="chartlet-root chartlet-multiples"><title id="chartlet-3352392941f81f9a-title">Web frameworks compared</title><desc id="chartlet-3352392941f81f9a-description">Small multiples of bars: 3 panels over 4 categories, each with its own value axis. Requests per second: Highest 118,000 req/s (Rust (Axum)), Lowest 18,000 req/s (Python (FastAPI)). Memory under load: Highest 118 MB (Node (Fastify)), Lowest 24 MB (Rust (Axum)). Cold start: Highest 210 ms (Python (FastAPI)), Lowest 3 ms (Rust (Axum)). Notes: Requests per second: higher is better; Memory under load: lower is better; Cold start: lower is better.</desc><style>.chartlet-root{--chartlet-text:#172033;--chartlet-muted:#344054;--chartlet-grid:#d9dee8;--chartlet-zero:#667085;--chartlet-accent:#2563eb;--chartlet-background:#fff;--chartlet-color-1:#2563eb;--chartlet-color-2:#c2410c;--chartlet-color-3:#475569;--chartlet-color-4:#111827;max-width:100%;height:auto;font-family:Inter,ui-sans-serif,system-ui,sans-serif;color:var(--chartlet-text)}#chartlet-3352392941f81f9a .chartlet-title{font-size:22px;font-weight:650;fill:var(--chartlet-text)}#chartlet-3352392941f81f9a .chartlet-label,#chartlet-3352392941f81f9a .chartlet-tick,#chartlet-3352392941f81f9a .chartlet-value,#chartlet-3352392941f81f9a .chartlet-value-inverse,#chartlet-3352392941f81f9a .chartlet-axis-title{font-size:12px;fill:var(--chartlet-muted)}#chartlet-3352392941f81f9a .chartlet-value,#chartlet-3352392941f81f9a .chartlet-value-inverse{font-weight:600}#chartlet-3352392941f81f9a .chartlet-value{fill:var(--chartlet-text)}#chartlet-3352392941f81f9a .chartlet-value-inverse{fill:var(--chartlet-background)}#chartlet-3352392941f81f9a .chartlet-axis-title{font-weight:600}#chartlet-3352392941f81f9a .chartlet-grid{stroke:var(--chartlet-grid);stroke-width:1}#chartlet-3352392941f81f9a .chartlet-zero{stroke:var(--chartlet-zero);stroke-width:1.5}#chartlet-3352392941f81f9a .chartlet-bar,#chartlet-3352392941f81f9a .chartlet-point{fill:var(--chartlet-accent)}#chartlet-3352392941f81f9a .chartlet-line{fill:none;stroke:var(--chartlet-accent);stroke-width:3;stroke-linecap:round;stroke-linejoin:round}#chartlet-3352392941f81f9a .chartlet-background{fill:var(--chartlet-background)}#chartlet-3352392941f81f9a.chartlet-multiples .chartlet-line{stroke-width:2}#chartlet-3352392941f81f9a .chartlet-panel-title{font-size:13px;font-weight:650;fill:var(--chartlet-text)}#chartlet-3352392941f81f9a .chartlet-panel-note{font-size:12px;fill:var(--chartlet-muted)}#chartlet-3352392941f81f9a .chartlet-panel-note-strong{fill:var(--chartlet-text);font-weight:600}</style><text x="139" y="28" text-anchor="start" class="chartlet-panel-title">Requests per</text><text x="139" y="44" text-anchor="start" class="chartlet-panel-title">second</text><text x="139" y="59" text-anchor="start" class="chartlet-panel-note">higher is better</text><text x="202.327" y="400" text-anchor="middle" class="chartlet-axis-title">req/s</text><line x1="139" y1="71" x2="139" y2="356" class="chartlet-zero"/><text x="139" y="378" text-anchor="middle" class="chartlet-tick">0</text><line x1="181.218" y1="71" x2="181.218" y2="356" class="chartlet-grid"/><line x1="223.436" y1="71" x2="223.436" y2="356" class="chartlet-grid"/><text x="223.436" y="378" text-anchor="middle" class="chartlet-tick">100,000</text><line x1="265.653" y1="71" x2="265.653" y2="356" class="chartlet-grid"/><text x="131" y="110.625" text-anchor="end" class="chartlet-label">Rust (Axum)</text><rect x="139" y="91.625" width="99.634" height="30" class="chartlet-bar"><title>Rust (Axum) – Requests per second: 118,000</title></rect><text x="244.634" y="110.625" text-anchor="start" class="chartlet-value">118,000</text><text x="131" y="181.875" text-anchor="end" class="chartlet-label">Go (Gin)</text><rect x="139" y="162.875" width="81.058" height="30" class="chartlet-bar"><title>Go (Gin) – Requests per second: 96,000</title></rect><text x="226.058" y="181.875" text-anchor="start" class="chartlet-value">96,000</text><text x="131" y="253.125" text-anchor="end" class="chartlet-label">Node (Fastify)</text><rect x="139" y="234.125" width="54.039" height="30" class="chartlet-bar"><title>Node (Fastify) – Requests per second: 64,000</title></rect><text x="199.039" y="253.125" text-anchor="start" class="chartlet-value">64,000</text><text x="131" y="324.375" text-anchor="end" class="chartlet-label">Python (FastAPI)</text><rect x="139" y="305.375" width="15.198" height="30" class="chartlet-bar"><title>Python (FastAPI) – Requests per second: 18,000</title></rect><text x="160.198" y="324.375" text-anchor="start" class="chartlet-value">18,000</text><text x="448.333" y="28" text-anchor="start" class="chartlet-panel-title">Memory under load</text><text x="448.333" y="59" text-anchor="start" class="chartlet-panel-note">lower is better</text><text x="511.66" y="400" text-anchor="middle" class="chartlet-axis-title">MB</text><line x1="448.333" y1="71" x2="448.333" y2="356" class="chartlet-zero"/><text x="448.333" y="378" text-anchor="middle" class="chartlet-tick">0</text><line x1="490.551" y1="71" x2="490.551" y2="356" class="chartlet-grid"/><text x="490.551" y="378" text-anchor="middle" class="chartlet-tick">50</text><line x1="532.769" y1="71" x2="532.769" y2="356" class="chartlet-grid"/><text x="532.769" y="378" text-anchor="middle" class="chartlet-tick">100</text><line x1="574.987" y1="71" x2="574.987" y2="356" class="chartlet-grid"/><text x="574.987" y="378" text-anchor="middle" class="chartlet-tick">150</text><text x="440.333" y="110.625" text-anchor="end" class="chartlet-label">Rust (Axum)</text><rect x="448.333" y="91.625" width="20.265" height="30" class="chartlet-bar"><title>Rust (Axum) – Memory under load: 24</title></rect><text x="474.598" y="110.625" text-anchor="start" class="chartlet-value">24</text><text x="440.333" y="181.875" text-anchor="end" class="chartlet-label">Go (Gin)</text><rect x="448.333" y="162.875" width="34.619" height="30" class="chartlet-bar"><title>Go (Gin) – Memory under load: 41</title></rect><text x="488.952" y="181.875" text-anchor="start" class="chartlet-value">41</text><text x="440.333" y="253.125" text-anchor="end" class="chartlet-label">Node (Fastify)</text><rect x="448.333" y="234.125" width="99.634" height="30" class="chartlet-bar"><title>Node (Fastify) – Memory under load: 118</title></rect><text x="553.967" y="253.125" text-anchor="start" class="chartlet-value">118</text><text x="440.333" y="324.375" text-anchor="end" class="chartlet-label">Python (FastAPI)</text><rect x="448.333" y="305.375" width="81.058" height="30" class="chartlet-bar"><title>Python (FastAPI) – Memory under load: 96</title></rect><text x="535.391" y="324.375" text-anchor="start" class="chartlet-value">96</text><text x="757.667" y="28" text-anchor="start" class="chartlet-panel-title">Cold start</text><text x="757.667" y="59" text-anchor="start" class="chartlet-panel-note">lower is better</text><text x="820.993" y="400" text-anchor="middle" class="chartlet-axis-title">ms</text><line x1="757.667" y1="71" x2="757.667" y2="356" class="chartlet-grid"/><text x="757.667" y="378" text-anchor="middle" class="chartlet-tick">1</text><line x1="804.593" y1="71" x2="804.593" y2="356" class="chartlet-grid"/><text x="804.593" y="378" text-anchor="middle" class="chartlet-tick">10</text><line x1="851.52" y1="71" x2="851.52" y2="356" class="chartlet-grid"/><text x="851.52" y="378" text-anchor="middle" class="chartlet-tick">100</text><text x="749.667" y="110.625" text-anchor="end" class="chartlet-label">Rust (Axum)</text><rect x="757.667" y="91.625" width="22.39" height="30" class="chartlet-bar"><title>Rust (Axum) – Cold start: 3</title></rect><text x="786.056" y="110.625" text-anchor="start" class="chartlet-value">3</text><text x="749.667" y="181.875" text-anchor="end" class="chartlet-label">Go (Gin)</text><rect x="757.667" y="162.875" width="32.8" height="30" class="chartlet-bar"><title>Go (Gin) – Cold start: 5</title></rect><text x="796.467" y="181.875" text-anchor="start" class="chartlet-value">5</text><text x="749.667" y="253.125" text-anchor="end" class="chartlet-label">Node (Fastify)</text><rect x="757.667" y="234.125" width="77.58" height="30" class="chartlet-bar"><title>Node (Fastify) – Cold start: 45</title></rect><text x="841.246" y="253.125" text-anchor="start" class="chartlet-value">45</text><text x="749.667" y="324.375" text-anchor="end" class="chartlet-label">Python (FastAPI)</text><rect x="757.667" y="305.375" width="108.974" height="30" class="chartlet-bar"><title>Python (FastAPI) – Cold start: 210</title></rect><text x="872.64" y="324.375" text-anchor="start" class="chartlet-value">210</text></svg></div><div class="chartlet-variant-mobile"><svg xmlns="http://www.w3.org/2000/svg" width="360" height="960" viewBox="0 0 360 960" id="chartlet-3352392941f81f9a-m" role="img" aria-labelledby="chartlet-3352392941f81f9a-m-title chartlet-3352392941f81f9a-m-description" class="chartlet-root chartlet-multiples"><title id="chartlet-3352392941f81f9a-m-title">Web frameworks compared</title><desc id="chartlet-3352392941f81f9a-m-description">Small multiples of bars: 3 panels over 4 categories, each with its own value axis. Requests per second: Highest 118,000 req/s (Rust (Axum)), Lowest 18,000 req/s (Python (FastAPI)). Memory under load: Highest 118 MB (Node (Fastify)), Lowest 24 MB (Rust (Axum)). Cold start: Highest 210 ms (Python (FastAPI)), Lowest 3 ms (Rust (Axum)). Notes: Requests per second: higher is better; Memory under load: lower is better; Cold start: lower is better.</desc><style>.chartlet-root{--chartlet-text:#172033;--chartlet-muted:#344054;--chartlet-grid:#d9dee8;--chartlet-zero:#667085;--chartlet-accent:#2563eb;--chartlet-background:#fff;--chartlet-color-1:#2563eb;--chartlet-color-2:#c2410c;--chartlet-color-3:#475569;--chartlet-color-4:#111827;max-width:100%;height:auto;font-family:Inter,ui-sans-serif,system-ui,sans-serif;color:var(--chartlet-text)}#chartlet-3352392941f81f9a-m .chartlet-title{font-size:22px;font-weight:650;fill:var(--chartlet-text)}#chartlet-3352392941f81f9a-m .chartlet-label,#chartlet-3352392941f81f9a-m .chartlet-tick,#chartlet-3352392941f81f9a-m .chartlet-value,#chartlet-3352392941f81f9a-m .chartlet-value-inverse,#chartlet-3352392941f81f9a-m .chartlet-axis-title{font-size:12px;fill:var(--chartlet-muted)}#chartlet-3352392941f81f9a-m .chartlet-value,#chartlet-3352392941f81f9a-m .chartlet-value-inverse{font-weight:600}#chartlet-3352392941f81f9a-m .chartlet-value{fill:var(--chartlet-text)}#chartlet-3352392941f81f9a-m .chartlet-value-inverse{fill:var(--chartlet-background)}#chartlet-3352392941f81f9a-m .chartlet-axis-title{font-weight:600}#chartlet-3352392941f81f9a-m .chartlet-grid{stroke:var(--chartlet-grid);stroke-width:1}#chartlet-3352392941f81f9a-m .chartlet-zero{stroke:var(--chartlet-zero);stroke-width:1.5}#chartlet-3352392941f81f9a-m .chartlet-bar,#chartlet-3352392941f81f9a-m .chartlet-point{fill:var(--chartlet-accent)}#chartlet-3352392941f81f9a-m .chartlet-line{fill:none;stroke:var(--chartlet-accent);stroke-width:3;stroke-linecap:round;stroke-linejoin:round}#chartlet-3352392941f81f9a-m .chartlet-background{fill:var(--chartlet-background)}#chartlet-3352392941f81f9a-m.chartlet-multiples .chartlet-line{stroke-width:2}#chartlet-3352392941f81f9a-m .chartlet-panel-title{font-size:13px;font-weight:650;fill:var(--chartlet-text)}#chartlet-3352392941f81f9a-m .chartlet-panel-note{font-size:12px;fill:var(--chartlet-muted)}#chartlet-3352392941f81f9a-m .chartlet-panel-note-strong{fill:var(--chartlet-text);font-weight:600}#chartlet-3352392941f81f9a-m .chartlet-title-small{font-size:18px}</style><text x="139" y="28" text-anchor="start" class="chartlet-panel-title">Requests per second</text><text x="139" y="43" text-anchor="start" class="chartlet-panel-note">higher is better</text><text x="211.66" y="314.667" text-anchor="middle" class="chartlet-axis-title">req/s</text><line x1="139" y1="55" x2="139" y2="270.667" class="chartlet-zero"/><text x="139" y="292.667" text-anchor="middle" class="chartlet-tick">0</text><line x1="187.44" y1="55" x2="187.44" y2="270.667" class="chartlet-grid"/><line x1="235.88" y1="55" x2="235.88" y2="270.667" class="chartlet-grid"/><text x="235.88" y="292.667" text-anchor="middle" class="chartlet-tick">100,000</text><line x1="284.32" y1="55" x2="284.32" y2="270.667" class="chartlet-grid"/><text x="131" y="85.958" text-anchor="end" class="chartlet-label">Rust (Axum)</text><rect x="139" y="66.958" width="114.318" height="30" class="chartlet-bar"><title>Rust (Axum) – Requests per second: 118,000</title></rect><text x="259.318" y="85.958" text-anchor="start" class="chartlet-value">118,000</text><text x="131" y="139.875" text-anchor="end" class="chartlet-label">Go (Gin)</text><rect x="139" y="120.875" width="93.005" height="30" class="chartlet-bar"><title>Go (Gin) – Requests per second: 96,000</title></rect><text x="238.005" y="139.875" text-anchor="start" class="chartlet-value">96,000</text><text x="131" y="193.792" text-anchor="end" class="chartlet-label">Node (Fastify)</text><rect x="139" y="174.792" width="62.003" height="30" class="chartlet-bar"><title>Node (Fastify) – Requests per second: 64,000</title></rect><text x="207.003" y="193.792" text-anchor="start" class="chartlet-value">64,000</text><text x="131" y="247.708" text-anchor="end" class="chartlet-label">Python (FastAPI)</text><rect x="139" y="228.708" width="17.438" height="30" class="chartlet-bar"><title>Python (FastAPI) – Requests per second: 18,000</title></rect><text x="162.438" y="247.708" text-anchor="start" class="chartlet-value">18,000</text><text x="139" y="340.667" text-anchor="start" class="chartlet-panel-title">Memory under load</text><text x="139" y="355.667" text-anchor="start" class="chartlet-panel-note">lower is better</text><text x="211.66" y="627.333" text-anchor="middle" class="chartlet-axis-title">MB</text><line x1="139" y1="367.667" x2="139" y2="583.333" class="chartlet-zero"/><text x="139" y="605.333" text-anchor="middle" class="chartlet-tick">0</text><line x1="187.44" y1="367.667" x2="187.44" y2="583.333" class="chartlet-grid"/><text x="187.44" y="605.333" text-anchor="middle" class="chartlet-tick">50</text><line x1="235.88" y1="367.667" x2="235.88" y2="583.333" class="chartlet-grid"/><text x="235.88" y="605.333" text-anchor="middle" class="chartlet-tick">100</text><line x1="284.32" y1="367.667" x2="284.32" y2="583.333" class="chartlet-grid"/><text x="284.32" y="605.333" text-anchor="middle" class="chartlet-tick">150</text><text x="131" y="398.625" text-anchor="end" class="chartlet-label">Rust (Axum)</text><rect x="139" y="379.625" width="23.251" height="30" class="chartlet-bar"><title>Rust (Axum) – Memory under load: 24</title></rect><text x="168.251" y="398.625" text-anchor="start" class="chartlet-value">24</text><text x="131" y="452.542" text-anchor="end" class="chartlet-label">Go (Gin)</text><rect x="139" y="433.542" width="39.721" height="30" class="chartlet-bar"><title>Go (Gin) – Memory under load: 41</title></rect><text x="184.721" y="452.542" text-anchor="start" class="chartlet-value">41</text><text x="131" y="506.458" text-anchor="end" class="chartlet-label">Node (Fastify)</text><rect x="139" y="487.458" width="114.318" height="30" class="chartlet-bar"><title>Node (Fastify) – Memory under load: 118</title></rect><text x="259.318" y="506.458" text-anchor="start" class="chartlet-value">118</text><text x="131" y="560.375" text-anchor="end" class="chartlet-label">Python (FastAPI)</text><rect x="139" y="541.375" width="93.005" height="30" class="chartlet-bar"><title>Python (FastAPI) – Memory under load: 96</title></rect><text x="238.005" y="560.375" text-anchor="start" class="chartlet-value">96</text><text x="139" y="653.333" text-anchor="start" class="chartlet-panel-title">Cold start</text><text x="139" y="668.333" text-anchor="start" class="chartlet-panel-note">lower is better</text><text x="211.66" y="940" text-anchor="middle" class="chartlet-axis-title">ms</text><line x1="139" y1="680.333" x2="139" y2="896" class="chartlet-grid"/><text x="139" y="918" text-anchor="middle" class="chartlet-tick">1</text><line x1="192.843" y1="680.333" x2="192.843" y2="896" class="chartlet-grid"/><text x="192.843" y="918" text-anchor="middle" class="chartlet-tick">10</text><line x1="246.686" y1="680.333" x2="246.686" y2="896" class="chartlet-grid"/><text x="246.686" y="918" text-anchor="middle" class="chartlet-tick">100</text><text x="131" y="711.292" text-anchor="end" class="chartlet-label">Rust (Axum)</text><rect x="139" y="692.292" width="25.69" height="30" class="chartlet-bar"><title>Rust (Axum) – Cold start: 3</title></rect><text x="170.69" y="711.292" text-anchor="start" class="chartlet-value">3</text><text x="131" y="765.208" text-anchor="end" class="chartlet-label">Go (Gin)</text><rect x="139" y="746.208" width="37.634" height="30" class="chartlet-bar"><title>Go (Gin) – Cold start: 5</title></rect><text x="182.634" y="765.208" text-anchor="start" class="chartlet-value">5</text><text x="131" y="819.125" text-anchor="end" class="chartlet-label">Node (Fastify)</text><rect x="139" y="800.125" width="89.014" height="30" class="chartlet-bar"><title>Node (Fastify) – Cold start: 45</title></rect><text x="234.014" y="819.125" text-anchor="start" class="chartlet-value">45</text><text x="131" y="873.042" text-anchor="end" class="chartlet-label">Python (FastAPI)</text><rect x="139" y="854.042" width="125.035" height="30" class="chartlet-bar"><title>Python (FastAPI) – Cold start: 210</title></rect><text x="270.035" y="873.042" text-anchor="start" class="chartlet-value">210</text></svg></div><p class="chartlet-source">Source: Illustrative values</p><details class="chartlet-data" data-viz-text><summary>Show chart data</summary><table><caption>Data for Web frameworks compared</caption><thead><tr><th scope="col">Category</th><th scope="col">Requests per second (req/s)</th><th scope="col">Memory under load (MB)</th><th scope="col">Cold start (ms)</th></tr></thead><tbody><tr><th scope="row">Rust (Axum)</th><td>118,000</td><td>24</td><td>3</td></tr><tr><th scope="row">Go (Gin)</th><td>96,000</td><td>41</td><td>5</td></tr><tr><th scope="row">Node (Fastify)</th><td>64,000</td><td>118</td><td>45</td></tr><tr><th scope="row">Python (FastAPI)</th><td>18,000</td><td>96</td><td>210</td></tr></tbody></table></details></figure></div>