add criterion benchmarking support, plus some benches

This commit is contained in:
tali 2023-04-14 18:52:55 -04:00
parent 84ba4d8145
commit 5f653db2c9
5 changed files with 450 additions and 2 deletions

2
.gitignore vendored
View File

@ -1 +1 @@
target/
**/target/

290
Cargo.lock generated
View File

@ -78,6 +78,17 @@ version = "1.0.70"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7de8ce5e0f9f8d88245311066a578d72b7af3e7088f32783804676302df237e4"
[[package]]
name = "atty"
version = "0.2.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8"
dependencies = [
"hermit-abi 0.1.19",
"libc",
"winapi",
]
[[package]]
name = "autocfg"
version = "1.1.0"
@ -96,6 +107,12 @@ version = "3.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535"
[[package]]
name = "cast"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5"
[[package]]
name = "cc"
version = "1.0.79"
@ -123,6 +140,17 @@ dependencies = [
"winapi",
]
[[package]]
name = "clap"
version = "2.34.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c"
dependencies = [
"bitflags",
"textwrap",
"unicode-width",
]
[[package]]
name = "clap"
version = "4.2.2"
@ -187,6 +215,106 @@ version = "0.8.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa"
[[package]]
name = "criterion"
version = "0.3.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b01d6de93b2b6c65e17c634a26653a29d107b3c98c607c765bf38d041531cd8f"
dependencies = [
"atty",
"cast",
"clap 2.34.0",
"criterion-plot",
"csv",
"itertools",
"lazy_static",
"num-traits",
"oorandom",
"plotters",
"rayon",
"regex",
"serde",
"serde_cbor",
"serde_derive",
"serde_json",
"tinytemplate",
"walkdir",
]
[[package]]
name = "criterion-plot"
version = "0.4.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2673cc8207403546f45f5fd319a974b1e6983ad1a3ee7e6041650013be041876"
dependencies = [
"cast",
"itertools",
]
[[package]]
name = "crossbeam-channel"
version = "0.5.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200"
dependencies = [
"cfg-if",
"crossbeam-utils",
]
[[package]]
name = "crossbeam-deque"
version = "0.8.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef"
dependencies = [
"cfg-if",
"crossbeam-epoch",
"crossbeam-utils",
]
[[package]]
name = "crossbeam-epoch"
version = "0.9.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "46bd5f3f85273295a9d14aedfb86f6aadbff6d8f5295c4a9edb08e819dcf5695"
dependencies = [
"autocfg",
"cfg-if",
"crossbeam-utils",
"memoffset",
"scopeguard",
]
[[package]]
name = "crossbeam-utils"
version = "0.8.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3c063cd8cc95f5c377ed0d4b49a4b21f632396ff690e8470c29b3359b346984b"
dependencies = [
"cfg-if",
]
[[package]]
name = "csv"
version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b015497079b9a9d69c02ad25de6c0a6edef051ea6360a327d0bd05802ef64ad"
dependencies = [
"csv-core",
"itoa",
"ryu",
"serde",
]
[[package]]
name = "csv-core"
version = "0.1.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2b2466559f260f48ad25fe6317b3c8dac77b5bdb5763ac7d9d6103530663bc90"
dependencies = [
"memchr",
]
[[package]]
name = "ctrlc"
version = "3.2.5"
@ -241,6 +369,12 @@ dependencies = [
"syn 2.0.15",
]
[[package]]
name = "either"
version = "1.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91"
[[package]]
name = "errno"
version = "0.3.1"
@ -268,6 +402,7 @@ version = "0.1.0"
dependencies = [
"ahash",
"bumpalo",
"criterion",
"hashbrown 0.13.2",
"mino",
"tracing",
@ -284,6 +419,12 @@ dependencies = [
"wasi 0.11.0+wasi-snapshot-preview1",
]
[[package]]
name = "half"
version = "1.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7"
[[package]]
name = "hashbrown"
version = "0.12.3"
@ -305,6 +446,15 @@ version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
[[package]]
name = "hermit-abi"
version = "0.1.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33"
dependencies = [
"libc",
]
[[package]]
name = "hermit-abi"
version = "0.2.6"
@ -377,6 +527,15 @@ dependencies = [
"windows-sys 0.48.0",
]
[[package]]
name = "itertools"
version = "0.10.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473"
dependencies = [
"either",
]
[[package]]
name = "itoa"
version = "1.0.6"
@ -443,6 +602,15 @@ version = "2.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
[[package]]
name = "memoffset"
version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1"
dependencies = [
"autocfg",
]
[[package]]
name = "mino"
version = "0.1.0"
@ -516,6 +684,12 @@ version = "1.17.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3"
[[package]]
name = "oorandom"
version = "11.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575"
[[package]]
name = "overload"
version = "0.1.1"
@ -528,6 +702,34 @@ version = "0.2.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116"
[[package]]
name = "plotters"
version = "0.3.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2538b639e642295546c50fcd545198c9d64ee2a38620a628724a3b266d5fbf97"
dependencies = [
"num-traits",
"plotters-backend",
"plotters-svg",
"wasm-bindgen",
"web-sys",
]
[[package]]
name = "plotters-backend"
version = "0.3.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "193228616381fecdc1224c62e96946dfbc73ff4384fba576e052ff8c1bea8142"
[[package]]
name = "plotters-svg"
version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f9a81d2759aae1dae668f783c308bc5c8ebd191ff4184aaa1b37f65a6ae5a56f"
dependencies = [
"plotters-backend",
]
[[package]]
name = "ppv-lite86"
version = "0.2.17"
@ -591,6 +793,28 @@ dependencies = [
"rand_core",
]
[[package]]
name = "rayon"
version = "1.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1d2df5196e37bcc87abebc0053e20787d73847bb33134a69841207dd0a47f03b"
dependencies = [
"either",
"rayon-core",
]
[[package]]
name = "rayon-core"
version = "1.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d"
dependencies = [
"crossbeam-channel",
"crossbeam-deque",
"crossbeam-utils",
"num_cpus",
]
[[package]]
name = "regex"
version = "1.7.3"
@ -635,6 +859,21 @@ version = "1.0.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041"
[[package]]
name = "same-file"
version = "1.0.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
dependencies = [
"winapi-util",
]
[[package]]
name = "scopeguard"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
[[package]]
name = "scratch"
version = "1.0.5"
@ -650,6 +889,16 @@ dependencies = [
"serde_derive",
]
[[package]]
name = "serde_cbor"
version = "0.11.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2bef2ebfde456fb76bbcf9f59315333decc4fda0b2b44b420243c11e0f5ec1f5"
dependencies = [
"half",
"serde",
]
[[package]]
name = "serde_derive"
version = "1.0.160"
@ -739,6 +988,15 @@ dependencies = [
"winapi-util",
]
[[package]]
name = "textwrap"
version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060"
dependencies = [
"unicode-width",
]
[[package]]
name = "thread_local"
version = "1.1.7"
@ -755,7 +1013,7 @@ version = "0.1.0"
dependencies = [
"anyhow",
"chrono",
"clap",
"clap 4.2.2",
"ctrlc",
"fish",
"mino",
@ -780,6 +1038,16 @@ dependencies = [
"winapi",
]
[[package]]
name = "tinytemplate"
version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc"
dependencies = [
"serde",
"serde_json",
]
[[package]]
name = "toml"
version = "0.7.3"
@ -906,6 +1174,16 @@ version = "0.9.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
[[package]]
name = "walkdir"
version = "2.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698"
dependencies = [
"same-file",
"winapi-util",
]
[[package]]
name = "wasi"
version = "0.10.0+wasi-snapshot-preview1"
@ -972,6 +1250,16 @@ version = "0.2.84"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d"
[[package]]
name = "web-sys"
version = "0.3.61"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e33b99f4b23ba3eec1a53ac264e35a755f00e966e0065077d6027c0f575b0b97"
dependencies = [
"js-sys",
"wasm-bindgen",
]
[[package]]
name = "winapi"
version = "0.3.9"

View File

@ -11,3 +11,14 @@ ahash = "0.8"
bumpalo = "3.12"
hashbrown = "0.13"
tracing = { version = "0.1", default_features = false }
[dev-dependencies]
criterion = "0.3"
[[bench]]
name = "find_locations"
harness = false
[[bench]]
name = "evaluation"
harness = false

View File

@ -0,0 +1,71 @@
use criterion::{BenchmarkId, Criterion};
use mino::{mat, Mat};
pub static MATRIX: &[&Mat] = &[
mat! {
"xxxxxxxx.x";
"xxxxxxx.xx";
"xxxx.xxxxx";
".xxxxxxxxx";
"xxxxx.xxxx";
"xxxx.xxxxx";
"xxxxxx.xxx";
".xxxxxxxxx";
"xxxxx.xxxx";
},
mat! {
"..OOSLL...";
".ZOOSSLI..";
"ZZZJJSLI..";
"xxxxxxxxx.";
"xxxxxxxx.x";
"xxxxxxxxx.";
"xxxxxx.xxx";
"xxxxxxx.xx";
"xxxxxx.xxx";
},
mat! {
"....T.....";
"...TTTSS..";
".....SS...";
"xxxxxxxx.x";
"xx.xxxxxxx";
".xxxxxxxxx";
"xxxxxxx.xx";
"x.xxxxxxxx";
"xxxxxxx.xx";
"xxxxxxxxx.";
"xxxxxxx.xx";
"x.xxxxxxxx";
},
mat! {
"I.........";
"I.........";
"I...T.....";
"IZ.TTTSSJJ";
"ZZLLLSS.J.";
"xxxxxxx.xx";
"x.xxxxxxxx";
"xxxxxxx.xx";
"xxxxxxxxx.";
"xxxxxxx.xx";
"x.xxxxxxxx";
"xxxxxx.xxx";
".xxxxxxxxx";
"xxxx.xxxxx";
},
];
fn benchmark_mdse(c: &mut Criterion) {
let mut c = c.benchmark_group("eval");
c.confidence_level(0.98);
for (i, &matrix) in MATRIX.iter().enumerate() {
c.bench_with_input(BenchmarkId::new("mystery_mdse", i), matrix, |b, matrix| {
b.iter(|| fish::eval::mystery_mdse(matrix))
});
}
c.finish();
}
criterion::criterion_group!(benches, benchmark_mdse);
criterion::criterion_main!(benches);

View File

@ -0,0 +1,78 @@
use criterion::{BenchmarkId, Criterion};
use mino::srs::PieceType::*;
use mino::srs::{Piece, Queue};
use mino::{mat, Mat};
pub static MATRIX_0: &Mat = mat! {
"xxxxxxxx.x";
"xxxxxxx.xx";
"xxxx.xxxxx";
".xxxxxxxxx";
"xxxxx.xxxx";
"xxxx.xxxxx";
"xxxxxx.xxx";
".xxxxxxxxx";
"xxxxx.xxxx";
};
pub static MATRIX_1: &Mat = mat! {
"...S..JJJ.";
"...SSTLLJZ";
".xxxxxxxxx";
"xxxxx.xxxx";
"xxxx.xxxxx";
"xxxxxx.xxx";
".xxxxxxxxx";
"xxxxx.xxxx";
};
pub static MATRIX_2: &Mat = mat! {
".S.T......";
".SSTT.....";
"xxxxxxx.xx";
"xxxx.xxxxx";
"xx.xxxxxxx";
"x.xxxxxxxx";
"xxxxxxxxx.";
"xxx.xxxxxx";
"xxxxx.xxxx";
};
pub static MATRIX_3: &Mat = mat! {
"..OOSLL...";
".ZOOSSLI..";
"ZZZJJSLI..";
"xxxxxxxxx.";
"xxxxxxxx.x";
"xxxxxxxxx.";
"xxxxxx.xxx";
"xxxxxxx.xx";
"xxxxxx.xxx";
};
pub static QUEUE_0: Queue<'_> = Queue::new(None, &[I, S, T, Z, L]);
pub static QUEUE_1: Queue<'_> = Queue::new(Some(J), &[O, L, O, I, S]);
pub static QUEUE_2: Queue<'_> = Queue::new(Some(S), &[Z, L, J, I, O]);
pub static QUEUE_3: Queue<'_> = Queue::new(Some(L), &[S, J, T, Z, I]);
pub static MATRIX: &[&Mat] = &[MATRIX_0, MATRIX_1, MATRIX_2, MATRIX_3];
pub static QUEUE: &[Queue<'_>] = &[QUEUE_0, QUEUE_1, QUEUE_2, QUEUE_3];
fn find_locations(mat: &Mat, queue: Queue<'_>) -> Vec<Piece> {
queue
.reachable()
.flat_map(|ty| fish::find::find_locations(mat, ty).map(move |loc| Piece { loc, ty }))
.collect()
}
fn benchmark(c: &mut Criterion) {
let mut c = c.benchmark_group("find_locations");
c.confidence_level(0.98);
for i in 0..4 {
c.bench_with_input(
BenchmarkId::from_parameter(i),
&(MATRIX[i], QUEUE[i]),
|b, (matrix, queue)| b.iter(|| find_locations(*matrix, *queue)),
);
}
c.finish();
}
criterion::criterion_group!(benches, benchmark);
criterion::criterion_main!(benches);