aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2019-11-09 10:06:09 -0500
committerJesse Luehrs <doy@tozt.net>2019-11-09 14:58:57 -0500
commitdbf02d880407df0667b56e52290decaab752a199 (patch)
tree993fa680b8248c60be182de640b5e5d88795089a
parent1df95eca71e5f2a9cb9adb2995a7552ec980dc8b (diff)
downloadvt100-rust-dbf02d880407df0667b56e52290decaab752a199.tar.gz
vt100-rust-dbf02d880407df0667b56e52290decaab752a199.zip
add a more realistic benchmark
-rwxr-xr-xbin/perf7
-rw-r--r--examples/perf.rs32
2 files changed, 35 insertions, 4 deletions
diff --git a/bin/perf b/bin/perf
index 9a70b08..6accd27 100755
--- a/bin/perf
+++ b/bin/perf
@@ -1,7 +1,7 @@
#!/bin/sh
set -eux
-rm -f target/release/* perf.* || true
+rm -f target/release/examples/* perf.* || true
if ! grep -q debug Cargo.toml; then
cat >> Cargo.toml <<EOF
@@ -9,9 +9,8 @@ if ! grep -q debug Cargo.toml; then
debug = true
EOF
fi
-cargo test --release --no-run
-bin=$(find ./target/release -maxdepth 1 -name '*split_escape*' -not -name '*.d')
-perf record -F99 --call-graph dwarf,16384 "$bin" --ignored
+cargo build --release --example perf
+perf record -F99 --call-graph dwarf,16384 target/release/examples/perf --ignored > /dev/null
perf script > perf.script
perl ~/coding/src/FlameGraph/stackcollapse-perf.pl perf.script > perf.collapsed
perl ~/coding/src/FlameGraph/flamegraph.pl perf.collapsed > perf.svg
diff --git a/examples/perf.rs b/examples/perf.rs
new file mode 100644
index 0000000..4222c6e
--- /dev/null
+++ b/examples/perf.rs
@@ -0,0 +1,32 @@
+use std::io::{Read as _, Write as _};
+
+fn read_frames() -> impl Iterator<Item = Vec<u8>> {
+ (1..=7625).map(|i| {
+ let mut file =
+ std::fs::File::open(format!("tests/data/crawl/crawl{}", i))
+ .unwrap();
+ let mut frame = vec![];
+ file.read_to_end(&mut frame).unwrap();
+ frame
+ })
+}
+
+fn draw_frames(frames: &[Vec<u8>]) {
+ let mut stdout = std::io::stdout();
+ let mut parser = vt100::Parser::new(24, 80);
+ let mut screen = parser.screen().clone();
+ for frame in frames {
+ parser.process(&frame);
+ let new_screen = parser.screen().clone();
+ let diff = new_screen.contents_diff(&screen);
+ stdout.write_all(&diff).unwrap();
+ screen = new_screen;
+ }
+}
+
+fn main() {
+ let frames: Vec<Vec<u8>> = read_frames().collect();
+ for _ in 1..10 {
+ draw_frames(&frames);
+ }
+}