Skip to content

Commit f585d63

Browse files
committed
Add a workflow to continuosly collect performance metrics
1 parent bada4ad commit f585d63

8 files changed

Lines changed: 161 additions & 36 deletions

File tree

.github/workflows/metrics.yml

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
on:
2+
schedule:
3+
- cron: "23 03 * * *"
4+
5+
name: Metrics
6+
7+
env:
8+
CARGO_INCREMENTAL: 0
9+
CARGO_NET_RETRY: 10
10+
RUSTUP_MAX_RETRIES: 10
11+
12+
jobs:
13+
metrics:
14+
runs-on: ubuntu-latest
15+
strategy:
16+
fail-fast: false
17+
matrix:
18+
backend: ["postgres", "sqlite", "mysql"]
19+
steps:
20+
- name: Checkout sources
21+
uses: actions/checkout@v2
22+
23+
- name: cache
24+
uses: actions/cache@v2
25+
with:
26+
path: |
27+
~/.cargo/registry
28+
~/.cargo/git
29+
diesel_bench/target
30+
key: metrics-${{matrix.backend}}-cargo-${{ hashFiles('diesel_bench/Cargo.toml')}}
31+
32+
- name: Install postgres (Linux)
33+
if: matrix.backend == 'postgres'
34+
run: |
35+
sudo apt-get update
36+
sudo apt-get install -y libpq-dev postgresql
37+
echo "host all all 127.0.0.1/32 md5" > sudo tee -a /etc/postgresql/10/main/pg_hba.conf
38+
sudo service postgresql restart && sleep 3
39+
sudo -u postgres psql -c "ALTER USER postgres PASSWORD 'postgres';"
40+
sudo service postgresql restart && sleep 3
41+
echo 'DATABASE_URL=postgres://postgres:postgres@localhost/' >> $GITHUB_ENV
42+
43+
- name: Install sqlite (Linux)
44+
if: matrix.backend == 'sqlite'
45+
run: |
46+
sudo apt-get update
47+
sudo apt-get install -y libsqlite3-dev
48+
echo 'SQLITE_DATABASE_URL=/tmp/test.db' >> $GITHUB_ENV
49+
echo 'DATABASE_URL=sqlite:///tmp/test.db' >> $GITHUB_ENV
50+
51+
- name: Install mysql (Linux)
52+
if: matrix.backend == 'mysql'
53+
run: |
54+
sudo apt-get update
55+
sudo apt-get -y install mysql-server libmysqlclient-dev
56+
sudo /etc/init.d/mysql start
57+
mysql -e "create database diesel_test; create database diesel_unit_test; grant all on \`diesel_%\`.* to 'root'@'localhost';" -uroot -proot
58+
echo 'DATABASE_URL=mysql://root:root@localhost/diesel_test' >> $GITHUB_ENV
59+
60+
- name: Install rust toolchain
61+
uses: actions-rs/toolchain@v1
62+
with:
63+
profile: minimal
64+
toolchain: stable
65+
override: true
66+
67+
- name: Run Benchmarks (Postgres)
68+
if: matrix.backend == 'postgres'
69+
uses: actions-rs/cargo@v1
70+
with:
71+
command: bench
72+
args: --manifest-path diesel_bench/Cargo.toml --no-default-features --features "${{matrix.backend}} sqlx sqlx/${{matrix.backend}} async-std sqlx/runtime-async-std-native-tls rustorm rustorm/with-${{matrix.backend}} rustorm_dao rust_postgres"
73+
74+
- name: Run Benchmarks (Sqlite)
75+
if: matrix.backend == 'sqlite'
76+
uses: actions-rs/cargo@v1
77+
with:
78+
command: bench
79+
args: --manifest-path diesel_bench/Cargo.toml --no-default-features --features "${{matrix.backend}} sqlx sqlx/${{matrix.backend}} async-std sqlx/runtime-async-std-native-tls rusqlite"
80+
81+
- name: Run Benchmarks (Mysql)
82+
if: matrix.backend == 'mysql'
83+
uses: actions-rs/cargo@v1
84+
with:
85+
command: bench
86+
args: --manifest-path diesel_bench/Cargo.toml --no-default-features --features "${{matrix.backend}} sqlx sqlx/${{matrix.backend}} async-std sqlx/runtime-async-std-native-tls rustorm rustorm/with-${{matrix.backend}} rustorm_dao rust_mysql"
87+
88+
- name: Push metrics
89+
env:
90+
SSH_AUTH_SOCK: /tmp/ssh_agent.sock
91+
run: |
92+
sudo apt-get -y install git
93+
94+
mkdir ~/.ssh -p
95+
ssh-agent -a $SSH_AUTH_SOCK > /dev/null
96+
ssh-keyscan github.com >> ~/.ssh/known_hosts
97+
echo "${{ secrets.METRIC_ACCESS_KEY }}" >> ~/.ssh/id_ed25519
98+
chmod 600 ~/.ssh/id_ed25519
99+
100+
git clone --depth 1 git@github.com:diesel-rs/metrics.git
101+
102+
cd metrics
103+
export FOLDER_NAME=$(date +%Y%m%d-%H%M%S)
104+
mkdir -p metrics/$FOLDER_NAME-$GITHUB_SHA-${{matrix.backend}}
105+
mv ../diesel_bench/target/criterion/* metrics/$FOLDER_NAME-$GITHUB_SHA-${{matrix.backend}}
106+
107+
git add metrics/$FOLDER_NAME-$GITHUB_SHA-${{matrix.backend}}
108+
git -c user.name=Bot -c user.email=dummy@example.com commit --message "📈"
109+
110+
git push origin master
111+
112+
- name: cleanup
113+
if: always()
114+
env:
115+
SSH_AUTH_SOCK: /tmp/ssh_agent.sock
116+
run: |
117+
rm -rf diesel_bench/target/criterion
118+
ssh-add -D
119+
rm -Rf ~/.ssh

diesel/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ edition = "2018"
1616
byteorder = "1.0"
1717
chrono = { version = "0.4.19", optional = true, default-features = false, features = ["clock", "std"] }
1818
libc = { version = "0.2.0", optional = true }
19-
libsqlite3-sys = { version = ">=0.8.0, <0.21.0", optional = true, features = ["min_sqlite_version_3_7_16"] }
19+
libsqlite3-sys = { version = ">=0.8.0, <0.23.0", optional = true, features = ["min_sqlite_version_3_7_16"] }
2020
mysqlclient-sys = { version = "0.2.0", optional = true }
2121
pq-sys = { version = "0.4.0", optional = true }
2222
quickcheck = { version = "0.9.0", optional = true }

diesel_bench/Cargo.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,10 @@ autobenches = false
1313
[dependencies]
1414
dotenv = "0.15"
1515
criterion = "0.3.2"
16-
sqlx = {version = "0.4.0-beta.1", optional = true}
16+
sqlx = {version = "0.5.0", optional = true}
1717
async-std = { version = "1.5", optional = true}
18-
rusqlite = {version = "0.23", optional = true}
19-
rust_postgres = {version = "0.17", optional = true, package = "postgres"}
18+
rusqlite = {version = "0.25", optional = true}
19+
rust_postgres = {version = "0.19", optional = true, package = "postgres"}
2020
rust_mysql = {version = "20.0.1", optional = true, package = "mysql"}
2121
rustorm = {version = "0.17", optional = true}
2222
rustorm_dao = {version = "0.5", optional = true}

diesel_bench/benches/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ mod sqlx_benches;
1414

1515
use criterion::{BenchmarkId, Criterion};
1616

17+
#[cfg(any(feature = "sqlite", feature = "rustorm"))]
1718
const SQLITE_MIGRATION_SQL: &[&str] = &[
1819
"CREATE TABLE IF NOT EXISTS users (
1920
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,

diesel_bench/benches/postgres_benches.rs

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ use rust_postgres::types::ToSql;
44
use rust_postgres::{Client, NoTls};
55
use std::collections::HashMap;
66

7+
const NO_PARAMS: Vec<&dyn ToSql> = Vec::new();
8+
79
pub struct User {
810
pub id: i32,
911
pub name: String,
@@ -72,7 +74,7 @@ pub fn bench_trivial_query_by_id(b: &mut Bencher, size: usize) {
7274

7375
b.iter(|| {
7476
client
75-
.query_raw(&query, Vec::new())
77+
.query_raw(&query, NO_PARAMS)
7678
.unwrap()
7779
.map(|row| {
7880
Ok(User {
@@ -96,7 +98,7 @@ pub fn bench_trivial_query_by_name(b: &mut Bencher, size: usize) {
9698

9799
b.iter(|| {
98100
client
99-
.query_raw(&query, Vec::new())
101+
.query_raw(&query, NO_PARAMS)
100102
.unwrap()
101103
.map(|row| {
102104
Ok(User {
@@ -125,7 +127,7 @@ pub fn bench_medium_complex_query_by_id(b: &mut Bencher, size: usize) {
125127

126128
b.iter(|| {
127129
client
128-
.query_raw(&query, Vec::new())
130+
.query_raw(&query, NO_PARAMS)
129131
.unwrap()
130132
.map(|row| {
131133
let user = User {
@@ -165,7 +167,7 @@ pub fn bench_medium_complex_query_by_name(b: &mut Bencher, size: usize) {
165167

166168
b.iter(|| {
167169
client
168-
.query_raw(&query, vec![])
170+
.query_raw(&query, NO_PARAMS)
169171
.unwrap()
170172
.map(|row| {
171173
let user = User {
@@ -208,7 +210,7 @@ pub fn loading_associations_sequentially(b: &mut Bencher) {
208210
});
209211

210212
let user_ids = client
211-
.query_raw("SELECT id FROM users", Vec::new())
213+
.query_raw("SELECT id FROM users", NO_PARAMS)
212214
.unwrap()
213215
.map(|row| Ok(row.get("id")))
214216
.collect::<Vec<i32>>()
@@ -243,7 +245,7 @@ pub fn loading_associations_sequentially(b: &mut Bencher) {
243245
client.execute(&insert_query as &str, &data).unwrap();
244246

245247
let all_posts = client
246-
.query_raw("SELECT id FROM posts", Vec::new())
248+
.query_raw("SELECT id FROM posts", NO_PARAMS)
247249
.unwrap()
248250
.map(|row| Ok(row.get("id")))
249251
.collect::<Vec<i32>>()
@@ -280,7 +282,7 @@ pub fn loading_associations_sequentially(b: &mut Bencher) {
280282

281283
b.iter(|| {
282284
let users = client
283-
.query_raw(&user_query, Vec::new())
285+
.query_raw(&user_query, NO_PARAMS)
284286
.unwrap()
285287
.map(|row| {
286288
Ok(User {
@@ -298,11 +300,11 @@ pub fn loading_associations_sequentially(b: &mut Bencher) {
298300
let user_ids = users
299301
.iter()
300302
.enumerate()
301-
.map(|(i, &User { ref id, .. })| {
303+
.map(|(i, &User { id, .. })| {
302304
posts_query += &format!("{}${}", if i == 0 { "" } else { "," }, i + 1);
303-
id as _
305+
id
304306
})
305-
.collect::<Vec<_>>();
307+
.collect::<Vec<i32>>();
306308

307309
posts_query += ")";
308310

@@ -326,11 +328,11 @@ pub fn loading_associations_sequentially(b: &mut Bencher) {
326328
let post_ids = posts
327329
.iter()
328330
.enumerate()
329-
.map(|(i, &Post { ref id, .. })| {
331+
.map(|(i, &Post { id, .. })| {
330332
comments_query += &format!("{}${}", if i == 0 { "" } else { "," }, i + 1);
331-
id as _
333+
id
332334
})
333-
.collect::<Vec<_>>();
335+
.collect::<Vec<i32>>();
334336

335337
comments_query += ")";
336338

diesel_bench/benches/rusqlite_benches.rs

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use criterion::Bencher;
22
use rusqlite::params;
33
use rusqlite::Connection;
44
use rusqlite::Row;
5-
use rusqlite::NO_PARAMS;
5+
use rusqlite::ToSql;
66
use std::collections::HashMap;
77

88
pub struct User {
@@ -67,12 +67,12 @@ fn connection() -> Connection {
6767
let conn = Connection::open_in_memory().unwrap();
6868

6969
for migration in super::SQLITE_MIGRATION_SQL {
70-
conn.execute(migration, NO_PARAMS).unwrap();
70+
conn.execute(migration, []).unwrap();
7171
}
7272

73-
conn.execute("DELETE FROM comments", NO_PARAMS).unwrap();
74-
conn.execute("DELETE FROM posts", NO_PARAMS).unwrap();
75-
conn.execute("DELETE FROM users", NO_PARAMS).unwrap();
73+
conn.execute("DELETE FROM comments", []).unwrap();
74+
conn.execute("DELETE FROM posts", []).unwrap();
75+
conn.execute("DELETE FROM users", []).unwrap();
7676

7777
conn
7878
}
@@ -113,7 +113,7 @@ pub fn bench_trivial_query_by_id(b: &mut Bencher, size: usize) {
113113

114114
b.iter(|| {
115115
query
116-
.query_map(NO_PARAMS, |row| Ok(User::from_row_by_id(row)))
116+
.query_map([], |row| Ok(User::from_row_by_id(row)))
117117
.unwrap()
118118
.collect::<Vec<_>>()
119119
});
@@ -129,7 +129,7 @@ pub fn bench_trivial_query_by_name(b: &mut Bencher, size: usize) {
129129

130130
b.iter(|| {
131131
query
132-
.query_map(NO_PARAMS, |row| Ok(User::from_row_by_name(row)))
132+
.query_map([], |row| Ok(User::from_row_by_name(row)))
133133
.unwrap()
134134
.collect::<Vec<_>>()
135135
});
@@ -148,7 +148,7 @@ pub fn bench_medium_complex_query_by_id(b: &mut Bencher, size: usize) {
148148

149149
b.iter(|| {
150150
query
151-
.query_map(NO_PARAMS, |row| {
151+
.query_map([], |row| {
152152
let user = User::from_row_by_id(row);
153153
let post = if let Some(id) = row.get(4).unwrap() {
154154
Some(Post {
@@ -180,7 +180,7 @@ pub fn bench_medium_complex_query_by_name(b: &mut Bencher, size: usize) {
180180

181181
b.iter(|| {
182182
query
183-
.query_map(NO_PARAMS, |row| {
183+
.query_map([], |row| {
184184
let user = User {
185185
id: row.get("myuser_id").unwrap(),
186186
name: row.get("name").unwrap(),
@@ -224,7 +224,7 @@ pub fn loading_associations_sequentially(b: &mut Bencher) {
224224
let mut user_query = conn.prepare("SELECT id FROM users").unwrap();
225225

226226
user_query
227-
.query_map(NO_PARAMS, |row| Ok(row.get("id").unwrap()))
227+
.query_map([], |row| Ok(row.get("id").unwrap()))
228228
.unwrap()
229229
.collect::<Result<Vec<i32>, _>>()
230230
.unwrap()
@@ -257,7 +257,7 @@ pub fn loading_associations_sequentially(b: &mut Bencher) {
257257
let mut post_query = conn.prepare("SELECT id FROM posts").unwrap();
258258

259259
post_query
260-
.query_map(NO_PARAMS, |row| Ok(row.get("id").unwrap()))
260+
.query_map([], |row| Ok(row.get("id").unwrap()))
261261
.unwrap()
262262
.collect::<Result<Vec<i32>, _>>()
263263
.unwrap()
@@ -291,7 +291,7 @@ pub fn loading_associations_sequentially(b: &mut Bencher) {
291291

292292
b.iter(|| {
293293
let users = user_query
294-
.query_map(NO_PARAMS, |row| Ok(User::from_row_by_id(row)))
294+
.query_map([], |row| Ok(User::from_row_by_id(row)))
295295
.unwrap()
296296
.collect::<Result<Vec<_>, _>>()
297297
.unwrap();
@@ -304,7 +304,7 @@ pub fn loading_associations_sequentially(b: &mut Bencher) {
304304
.enumerate()
305305
.map(|(i, &User { ref id, .. })| {
306306
posts_query += &format!("{}?", if i == 0 { "" } else { "," });
307-
id
307+
id as &dyn ToSql
308308
})
309309
.collect::<Vec<_>>();
310310

@@ -313,7 +313,7 @@ pub fn loading_associations_sequentially(b: &mut Bencher) {
313313
let mut posts_query = conn.prepare(&posts_query).unwrap();
314314

315315
let posts = posts_query
316-
.query_map(user_ids, |row| Ok(Post::from_row_by_id(row)))
316+
.query_map(&user_ids as &[_], |row| Ok(Post::from_row_by_id(row)))
317317
.unwrap()
318318
.collect::<Result<Vec<_>, _>>()
319319
.unwrap();
@@ -326,7 +326,7 @@ pub fn loading_associations_sequentially(b: &mut Bencher) {
326326
.enumerate()
327327
.map(|(i, &Post { ref id, .. })| {
328328
comments_query += &format!("{}?", if i == 0 { "" } else { "," });
329-
id
329+
id as &dyn ToSql
330330
})
331331
.collect::<Vec<_>>();
332332

@@ -335,7 +335,7 @@ pub fn loading_associations_sequentially(b: &mut Bencher) {
335335
let mut comments_query = conn.prepare(&comments_query).unwrap();
336336

337337
let comments = comments_query
338-
.query_map(post_ids, |row| Ok(Comment::from_row_by_id(row)))
338+
.query_map(&post_ids as &[_], |row| Ok(Comment::from_row_by_id(row)))
339339
.unwrap()
340340
.collect::<Result<Vec<_>, _>>()
341341
.unwrap();

diesel_bench/benches/sqlx_benches.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,7 @@ pub fn bench_medium_complex_query_query_as_macro(b: &mut Bencher, size: usize) {
247247
b.iter(|| {
248248
async_std::task::block_on(async {
249249
let res = sqlx::query_as!(UserWithPost,
250-
"SELECT u.id as myuser_id, u.name, u.hair_color, p.id as \"post_id?\", p.user_id as \"user_id?\", p.title as \"title?\", p.body as \"body?\"\
250+
"SELECT u.id as \"myuser_id!\", u.name as \"name!\", u.hair_color, p.id as \"post_id?\", p.user_id as \"user_id?\", p.title as \"title?\", p.body as \"body?\"\
251251
FROM users as u LEFT JOIN posts as p on u.id = p.user_id"
252252
)
253253
.fetch_all(&mut conn)

0 commit comments

Comments
 (0)