Skip to content

Commit 9660e2c

Browse files
[rust/axum] performance improvements (#10001)
* build: upgraded dependencies * feat: dependency updates and performance tweaks
1 parent 1cc33ea commit 9660e2c

File tree

8 files changed

+525
-514
lines changed

8 files changed

+525
-514
lines changed

frameworks/Rust/axum/Cargo.lock

Lines changed: 481 additions & 486 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

frameworks/Rust/axum/Cargo.toml

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -50,42 +50,43 @@ deadpool-postgres = { version = "0.14.1", features = ["rt_tokio_1", "serde"] }
5050
dotenv = "0.15.0"
5151
futures = "0.3.31"
5252
futures-util = "0.3.31"
53-
mongodb = { version = "3.2.3", features = [
53+
mongodb = { version = "3.2.4", features = [
5454
"zstd-compression",
5555
"snappy-compression",
5656
"zlib-compression",
5757
] }
58-
num_cpus = "1.16.0"
59-
rand = { version = "0.9.1", features = ["small_rng"] }
58+
59+
num_cpus = "1.17.0"
60+
rand = { version = "0.9.2", features = ["small_rng"] }
6061
serde = { version = "1.0.219", features = ["derive"] }
61-
serde_json = "1.0.140"
62-
sqlx = { version = "0.8.5", features = [
62+
serde_json = "1.0.141"
63+
sqlx = { version = "0.8.6", features = [
6364
"postgres",
6465
"macros",
6566
"runtime-tokio",
6667
"tls-rustls",
6768
] }
68-
tokio = { version = "1.45.0", features = ["full"] }
69+
tokio = { version = "1.46.1", features = ["full"] }
6970
tokio-pg-mapper = { version = "0.2.0" }
7071
tokio-pg-mapper-derive = { version = "0.2.0" }
7172
tokio-postgres = { version = "0.7.13" }
7273
tower = { version = "0.5.2", features = ["util"] }
73-
tower-http = { version = "0.6.4", features = ["set-header"] }
74+
tower-http = { version = "0.6.6", features = ["set-header"] }
7475
yarte = "0.15.7"
7576
simd-json = { version = "0.15.1", optional = true }
7677
axum-core = { version = "0.5.2", optional = true }
7778
mime = { version = "0.3.17", optional = true }
7879
bytes = { version = "1.10.1", optional = true }
7980
serde_path_to_error = { version = "0.1.17", optional = true }
80-
socket2 = "0.5.9"
81+
socket2 = "0.5.10"
8182
hyper = { version = "1.6", features = ["server", "http1"] }
8283
hyper-util = { version = "0.1", features = ["tokio", "server-auto", "http1"] }
8384
quick_cache = "0.6.14"
84-
mimalloc = "0.1.46"
85+
mimalloc = "0.1.47"
8586

8687

8788
[profile.release]
8889
lto = "fat"
8990
codegen-units = 1
90-
strip = true
91+
# strip = true
9192
opt-level = 3

frameworks/Rust/axum/axum.dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
FROM docker.io/rust:1.86-slim-bookworm AS builder
1+
FROM docker.io/rust:1.88-slim-bookworm AS builder
22

33
RUN apt-get update && apt-get install -y --no-install-recommends \
44
pkg-config libssl-dev \

frameworks/Rust/axum/src/main.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
mod common;
22
mod server;
33

4-
use axum::{http::StatusCode, response::IntoResponse, routing::get, Router};
4+
use axum::{response::IntoResponse, routing::get, Router};
55
use common::models::Message;
66
use dotenv::dotenv;
77
use mimalloc::MiMalloc;
@@ -14,20 +14,22 @@ use axum::Json;
1414
#[cfg(feature = "simd-json")]
1515
use common::simd_json::Json;
1616

17+
const HELLO_WORLD: &str = "Hello, World!";
18+
1719
/// Return a plaintext static string.
1820
#[inline(always)]
1921
pub async fn plaintext() -> &'static str {
20-
"Hello, World!"
22+
&HELLO_WORLD
2123
}
2224

2325
/// Return a JSON message.
2426
#[inline(always)]
2527
pub async fn json() -> impl IntoResponse {
2628
let message = Message {
27-
message: "Hello, World!",
29+
message: HELLO_WORLD,
2830
};
2931

30-
(StatusCode::OK, Json(message))
32+
Json(message)
3133
}
3234

3335
fn main() {

frameworks/Rust/axum/src/main_sqlx.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
mod common;
22
mod sqlx;
33

4-
use std::sync::Arc;
4+
use std::{borrow::Cow, sync::Arc};
55

66
use ::sqlx::PgPool;
77
use axum::{
@@ -80,7 +80,7 @@ async fn fortunes(State(AppState { db, .. }): State<AppState>) -> impl IntoRespo
8080

8181
fortunes.push(Fortune {
8282
id: 0,
83-
message: "Additional fortune added at request time.".to_string(),
83+
message: Cow::Borrowed("Additional fortune added at request time."),
8484
});
8585

8686
fortunes.sort_by(|a, b| a.message.cmp(&b.message));

frameworks/Rust/axum/src/pg/database.rs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use std::{convert::Infallible, io, sync::Arc};
1+
use std::{borrow::Cow, convert::Infallible, io, sync::Arc};
22

33
use axum::{extract::FromRequestParts, http::request::Parts};
44
use futures::{stream::futures_unordered::FuturesUnordered, StreamExt, TryStreamExt};
@@ -99,23 +99,22 @@ impl PgConnection {
9999

100100
for w in &mut worlds {
101101
w.randomnumber = random_id(&mut rng);
102-
ids.push(w.id);
103-
nids.push(w.randomnumber);
102+
ids.push(&w.id);
103+
nids.push(&w.randomnumber);
104104
}
105105

106106
// Update the random worlds in the database.
107107
self.client
108108
.execute(&self.updates, &[&ids, &nids])
109-
.await
110-
.unwrap();
109+
.await?;
111110

112111
Ok(worlds)
113112
}
114113

115114
pub async fn fetch_all_fortunes(&self) -> Result<Vec<Fortune>, PgError> {
116115
let mut fortunes = vec![Fortune {
117116
id: 0,
118-
message: "Additional fortune added at request time.".parse().unwrap(),
117+
message: Cow::Borrowed("Additional fortune added at request time."),
119118
}];
120119

121120
let rows = self
@@ -128,7 +127,7 @@ impl PgConnection {
128127
while let Some(row) = rows.next().await.transpose()? {
129128
fortunes.push(Fortune {
130129
id: row.get(0),
131-
message: row.get(1),
130+
message: Cow::Owned(row.get(1)),
132131
});
133132
}
134133

frameworks/Rust/axum/src/pg/models.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1+
use std::borrow::Cow;
2+
13
use serde::{Deserialize, Serialize};
24

35
#[allow(non_snake_case)]
46
#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
57
pub struct Fortune {
68
pub id: i32,
7-
pub message: String,
9+
pub message: Cow<'static, str>,
810
}
911

1012
#[allow(non_snake_case)]

frameworks/Rust/axum/src/sqlx/models.rs

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,22 @@
1+
use std::borrow::Cow;
2+
13
use serde::{Deserialize, Serialize};
2-
use sqlx::FromRow;
4+
use sqlx::{FromRow, Row};
5+
use sqlx::postgres::PgRow;
36

4-
#[derive(Clone, Debug, PartialEq, Deserialize, Serialize, FromRow)]
7+
#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
58
pub struct Fortune {
69
pub id: i32,
7-
pub message: String,
10+
pub message: Cow<'static, str>,
11+
}
12+
13+
impl FromRow<'_, PgRow> for Fortune {
14+
fn from_row(row: &PgRow) -> Result<Self, sqlx::Error> {
15+
Ok(Fortune {
16+
id: row.try_get(0usize)?,
17+
message: Cow::Owned(row.try_get(1usize)?)
18+
})
19+
}
820
}
921

1022
#[derive(Clone, Debug, PartialEq, Deserialize, Serialize, FromRow)]

0 commit comments

Comments
 (0)