Skip to content

Commit 724a773

Browse files
fafhrd91NateBrady23
authored andcommitted
Actix: unify and optimize platform benchmarks (#3806)
* merge raw benchmarks * optimize platform benchmarks
1 parent 60c9cd0 commit 724a773

8 files changed

+234
-280
lines changed

frameworks/Rust/actix/Cargo.lock

+50-50
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

frameworks/Rust/actix/Cargo.toml

-4
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,6 @@ path = "src/main.rs"
1111
name = "actix-raw"
1212
path = "src/main_raw.rs"
1313

14-
[[bin]]
15-
name = "actix-raw-db"
16-
path = "src/main_raw_db.rs"
17-
1814
[[bin]]
1915
name = "actix-diesel"
2016
path = "src/main_diesel.rs"

frameworks/Rust/actix/actix-raw-db.dockerfile

-9
This file was deleted.

frameworks/Rust/actix/benchmark_config.json

+1-17
Original file line numberDiff line numberDiff line change
@@ -23,22 +23,6 @@
2323
"fortune_url": "/fortune",
2424
"json_url": "/json",
2525
"plaintext_url": "/plaintext",
26-
"port": 8080,
27-
"approach": "Realistic",
28-
"classification": "Platform",
29-
"database": "Postgres",
30-
"framework": "actix",
31-
"language": "Rust",
32-
"orm": "Raw",
33-
"platform": "None",
34-
"webserver": "actix-web",
35-
"os": "Linux",
36-
"database_os": "Linux",
37-
"display_name": "Actix [raw]",
38-
"notes": "",
39-
"versus": ""
40-
},
41-
"raw-db": {
4226
"db_url": "/db",
4327
"query_url": "/queries?q=",
4428
"update_url": "/updates?q=",
@@ -53,7 +37,7 @@
5337
"webserver": "actix-web",
5438
"os": "Linux",
5539
"database_os": "Linux",
56-
"display_name": "Actix [pg-raw]",
40+
"display_name": "Actix [raw]",
5741
"notes": "",
5842
"versus": ""
5943
},

frameworks/Rust/actix/src/db_pg.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,8 @@ impl Handler<UpdateWorld> for PgConnection {
114114
worlds.sort_by_key(|w| w.id);
115115

116116
update.pop();
117-
update.push_str(" ORDER BY 1) AS temp(id, randomnumber) WHERE temp.id = world.id");
117+
update
118+
.push_str(" ORDER BY 1) AS temp(id, randomnumber) WHERE temp.id = world.id");
118119
self.conn.execute(&update, &[]).unwrap();
119120

120121
Ok(worlds)

frameworks/Rust/actix/src/main_raw.rs

+148-13
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ extern crate rand;
1414
#[macro_use]
1515
extern crate diesel;
1616

17-
use std::io;
17+
use std::{cmp, mem};
1818

1919
use actix::prelude::*;
2020
use actix_web::server::{self, HttpHandler, HttpHandlerTask, HttpServer, Writer};
@@ -27,8 +27,8 @@ mod db_pg;
2727
mod models;
2828
mod utils;
2929

30-
use db_pg::{PgConnection, TellFortune};
31-
use utils::{Message, Writer as JsonWriter};
30+
use db_pg::{PgConnection, RandomWorld, RandomWorlds, TellFortune, UpdateWorld};
31+
use utils::{Message, StackWriter, Writer as JsonWriter};
3232

3333
const HTTPOK: &[u8] = b"HTTP/1.1 200 OK\r\n";
3434
const HDR_SERVER: &[u8] = b"Server: Actix\r\n";
@@ -48,9 +48,45 @@ impl HttpHandler for App {
4848
match path.len() {
4949
10 if path == "/plaintext" => return Ok(Box::new(Plaintext)),
5050
5 if path == "/json" => return Ok(Box::new(Json)),
51+
3 if path == "/db" => {
52+
return Ok(Box::new(World {
53+
fut: self.db.send(RandomWorld),
54+
}))
55+
}
5156
8 if path == "/fortune" => {
52-
let fut = Box::new(self.db.send(TellFortune));
53-
return Ok(Box::new(Fortune { fut }));
57+
return Ok(Box::new(Fortune {
58+
fut: self.db.send(TellFortune),
59+
}));
60+
}
61+
8 if path == "/queries" => {
62+
let q = req
63+
.query()
64+
.get("q")
65+
.map(|q| {
66+
cmp::min(
67+
500,
68+
cmp::max(1, q.parse::<u16>().ok().unwrap_or(1)),
69+
)
70+
})
71+
.unwrap_or(1);
72+
return Ok(Box::new(Queries {
73+
fut: self.db.send(RandomWorlds(q)),
74+
}));
75+
}
76+
8 if path == "/updates" => {
77+
let q = req
78+
.query()
79+
.get("q")
80+
.map(|q| {
81+
cmp::min(
82+
500,
83+
cmp::max(1, q.parse::<u16>().ok().unwrap_or(1)),
84+
)
85+
})
86+
.unwrap_or(1);
87+
return Ok(Box::new(Updates {
88+
fut: self.db.send(UpdateWorld(q)),
89+
}));
5490
}
5591
_ => (),
5692
}
@@ -96,9 +132,7 @@ impl HttpHandlerTask for Json {
96132
}
97133

98134
struct Fortune {
99-
fut: Box<
100-
Future<Item = io::Result<Vec<models::Fortune>>, Error = actix::MailboxError>,
101-
>,
135+
fut: actix::dev::Request<Syn, PgConnection, TellFortune>,
102136
}
103137

104138
#[derive(Template)]
@@ -111,17 +145,118 @@ impl HttpHandlerTask for Fortune {
111145
fn poll_io(&mut self, io: &mut Writer) -> Poll<bool, Error> {
112146
match self.fut.poll() {
113147
Ok(Async::Ready(Ok(rows))) => {
114-
let tmpl = FortuneTemplate { items: &rows };
115-
let body = tmpl.render().unwrap();
148+
let mut body: [u8; 2048] = unsafe { mem::uninitialized() };
149+
let len = {
150+
let mut writer = StackWriter(&mut body, 0);
151+
let tmpl = FortuneTemplate { items: &rows };
152+
tmpl.render_into(&mut writer).unwrap();
153+
writer.1
154+
};
116155

117156
let mut bytes = io.buffer();
118-
bytes.reserve(196 + body.len());
157+
bytes.reserve(196 + len);
119158
bytes.extend_from_slice(HTTPOK);
120159
bytes.extend_from_slice(HDR_SERVER);
121160
bytes.extend_from_slice(HDR_CTHTML);
122-
server::write_content_length(body.len(), &mut bytes);
161+
server::write_content_length(len, &mut bytes);
162+
io.set_date(bytes);
163+
bytes.extend_from_slice(&body[..len]);
164+
Ok(Async::Ready(true))
165+
}
166+
Ok(Async::NotReady) => Ok(Async::NotReady),
167+
Ok(Async::Ready(Err(e))) => Err(e.into()),
168+
Err(e) => Err(e.into()),
169+
}
170+
}
171+
}
172+
173+
struct World {
174+
fut: actix::dev::Request<Syn, PgConnection, RandomWorld>,
175+
}
176+
177+
impl HttpHandlerTask for World {
178+
fn poll_io(&mut self, io: &mut Writer) -> Poll<bool, Error> {
179+
match self.fut.poll() {
180+
Ok(Async::Ready(Ok(row))) => {
181+
let mut body: [u8; 48] = unsafe { mem::uninitialized() };
182+
let len = {
183+
let mut writer = StackWriter(&mut body, 0);
184+
serde_json::to_writer(&mut writer, &row).unwrap();
185+
writer.1
186+
};
187+
188+
let mut bytes = io.buffer();
189+
bytes.reserve(196);
190+
bytes.extend_from_slice(HTTPOK);
191+
bytes.extend_from_slice(HDR_SERVER);
192+
bytes.extend_from_slice(HDR_CTJSON);
193+
server::write_content_length(len, &mut bytes);
194+
io.set_date(bytes);
195+
bytes.extend_from_slice(&body[..len]);
196+
Ok(Async::Ready(true))
197+
}
198+
Ok(Async::NotReady) => Ok(Async::NotReady),
199+
Ok(Async::Ready(Err(e))) => Err(e.into()),
200+
Err(e) => Err(e.into()),
201+
}
202+
}
203+
}
204+
205+
struct Queries {
206+
fut: actix::dev::Request<Syn, PgConnection, RandomWorlds>,
207+
}
208+
209+
impl HttpHandlerTask for Queries {
210+
fn poll_io(&mut self, io: &mut Writer) -> Poll<bool, Error> {
211+
match self.fut.poll() {
212+
Ok(Async::Ready(Ok(worlds))) => {
213+
let mut body: [u8; 24576] = unsafe { mem::uninitialized() };
214+
let len = {
215+
let mut writer = StackWriter(&mut body, 0);
216+
serde_json::to_writer(&mut writer, &worlds).unwrap();
217+
writer.1
218+
};
219+
220+
let mut bytes = io.buffer();
221+
bytes.reserve(196 + len);
222+
bytes.extend_from_slice(HTTPOK);
223+
bytes.extend_from_slice(HDR_SERVER);
224+
bytes.extend_from_slice(HDR_CTJSON);
225+
server::write_content_length(len, &mut bytes);
226+
io.set_date(bytes);
227+
bytes.extend_from_slice(&body[..len]);
228+
Ok(Async::Ready(true))
229+
}
230+
Ok(Async::NotReady) => Ok(Async::NotReady),
231+
Ok(Async::Ready(Err(e))) => Err(e.into()),
232+
Err(e) => Err(e.into()),
233+
}
234+
}
235+
}
236+
237+
struct Updates {
238+
fut: actix::dev::Request<Syn, PgConnection, UpdateWorld>,
239+
}
240+
241+
impl HttpHandlerTask for Updates {
242+
fn poll_io(&mut self, io: &mut Writer) -> Poll<bool, Error> {
243+
match self.fut.poll() {
244+
Ok(Async::Ready(Ok(worlds))) => {
245+
let mut body: [u8; 24576] = unsafe { mem::uninitialized() };
246+
let len = {
247+
let mut writer = StackWriter(&mut body, 0);
248+
serde_json::to_writer(&mut writer, &worlds).unwrap();
249+
writer.1
250+
};
251+
252+
let mut bytes = io.buffer();
253+
bytes.reserve(196 + len);
254+
bytes.extend_from_slice(HTTPOK);
255+
bytes.extend_from_slice(HDR_SERVER);
256+
bytes.extend_from_slice(HDR_CTJSON);
257+
server::write_content_length(len, &mut bytes);
123258
io.set_date(bytes);
124-
bytes.extend_from_slice(body.as_ref());
259+
bytes.extend_from_slice(&body[..len]);
125260
Ok(Async::Ready(true))
126261
}
127262
Ok(Async::NotReady) => Ok(Async::NotReady),

0 commit comments

Comments
 (0)