diff --git a/Cargo.lock b/Cargo.lock index 72d4c42..b1a23c5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -184,6 +184,7 @@ checksum = "c77ed9a32a62e6ca27175d00d29d05ca32e396ea1eb5fb01d8256b669cec7663" dependencies = [ "anstyle", "clap_lex", + "terminal_size", ] [[package]] @@ -192,6 +193,12 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" +[[package]] +name = "condtype" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf0a07a401f374238ab8e2f11a104d2851bf9ce711ec69804834de8af45c7af" + [[package]] name = "console" version = "0.15.7" @@ -204,6 +211,17 @@ dependencies = [ "windows-sys 0.45.0", ] +[[package]] +name = "core_affinity" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "622892f5635ce1fc38c8f16dfc938553ed64af482edb5e150bf4caedbfcb2304" +dependencies = [ + "libc", + "num_cpus", + "winapi", +] + [[package]] name = "criterion" version = "0.5.1" @@ -298,6 +316,31 @@ dependencies = [ "winapi", ] +[[package]] +name = "divan" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9fe20b31e5a6a2c689cb9cd6b8ab3e1b417536b2369830b037acfee34b11469" +dependencies = [ + "clap", + "condtype", + "core_affinity", + "divan-macros", + "linkme", + "regex-lite", +] + +[[package]] +name = "divan-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c41656525d3cbca56bc91ca045ffb591b7b7d7bd7453750b63bacc35c46f3cc" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "downcast-rs" version = "1.2.0" @@ -469,6 +512,26 @@ version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" +[[package]] +name = "linkme" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ed2ee9464ff9707af8e9ad834cffa4802f072caad90639c583dd3c62e6e608" +dependencies = [ + "linkme-impl", +] + +[[package]] +name = "linkme-impl" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba125974b109d512fccbc6c0244e7580143e460895dfd6ea7f8bbb692fd94396" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "linux-raw-sys" version = "0.4.10" @@ -793,6 +856,12 @@ dependencies = [ "regex-syntax", ] +[[package]] +name = "regex-lite" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30b661b2f27137bdbc16f00eda72866a92bb28af1753ffbd56744fb6e2e9cd8e" + [[package]] name = "regex-syntax" version = "0.8.2" @@ -807,9 +876,9 @@ checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" [[package]] name = "rustix" -version = "0.38.20" +version = "0.38.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67ce50cb2e16c2903e30d1cbccfd8387a74b9d4c938b6a4c5ec6cc7556f7a8a0" +checksum = "2b426b0506e5d50a7d8dafcf2e81471400deb602392c7dd110815afb4eaf02a3" dependencies = [ "bitflags 2.4.1", "errno", @@ -847,18 +916,18 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "serde" -version = "1.0.189" +version = "1.0.190" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e422a44e74ad4001bdc8eede9a4570ab52f71190e9c076d14369f38b9200537" +checksum = "91d3c334ca1ee894a2c6f6ad698fe8c435b76d504b13d436f0685d648d6d96f7" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.189" +version = "1.0.190" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e48d1f918009ce3145511378cf68d613e3b3d9137d67272562080d68a2b32d5" +checksum = "67c5609f394e5c2bd7fc51efda478004ea80ef42fee983d5c67a65e34f32c0e3" dependencies = [ "proc-macro2", "quote", @@ -1028,6 +1097,16 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "terminal_size" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21bebf2b7c9e0a515f6e0f8c51dc0f8e4696391e6f1ff30379559f8365fb0df7" +dependencies = [ + "rustix", + "windows-sys 0.48.0", +] + [[package]] name = "termios" version = "0.2.2" @@ -1171,6 +1250,7 @@ dependencies = [ "bytes", "criterion", "crossterm", + "divan", "iai", "insta", "once_cell", @@ -1514,18 +1594,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.7.14" +version = "0.7.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69c48d63854f77746c68a5fbb4aa17f3997ece1cb301689a257af8cb80610d21" +checksum = "ede7d7c7970ca2215b8c1ccf4d4f354c4733201dfaaba72d44ae5b37472e4901" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.14" +version = "0.7.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c258c1040279e4f88763a113de72ce32dde2d50e2a94573f15dd534cea36a16d" +checksum = "4b27b1bb92570f989aac0ab7e9cbfbacdd65973f7ee920d9f0e71ebac878fd0b" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index 7d166b3..a1fb0a7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -38,7 +38,8 @@ vt100 = "0.15.2" [dev-dependencies] bytes = "1.5.0" -criterion = "0.5.1" +criterion = { version = "0.5.1", features = ["html_reports"] } +divan = "0.1.1" #TODO: go back to release version, once it is fixed # iai = "0.1.1" iai = { git = "https://github.com/sigaloid/iai", rev = "6c83e942" } @@ -68,6 +69,9 @@ harness = false name = "iai" harness = false +[[bench]] +name = "divan" +harness = false [[example]] name = "simple_ls_chan" diff --git a/benches/divan.rs b/benches/divan.rs new file mode 100644 index 0000000..2cb3da5 --- /dev/null +++ b/benches/divan.rs @@ -0,0 +1,229 @@ +use once_cell::sync::Lazy; +use ratatui::{backend::TestBackend, Terminal}; +use tui_term::widget::PseudoTerminal; +use vt100::Screen; + +fn main() { + divan::main(); +} + +static SIMPLE_LS_ACTIONS: Lazy = Lazy::new(|| { + let stream = include_bytes!("../test/typescript/simple_ls.typescript"); + let mut parser = vt100::Parser::new(24, 80, 0); + parser.process(stream); + parser.screen().clone() +}); + +static VTTEST_02_01: Lazy = Lazy::new(|| { + let stream = include_bytes!("../test/typescript/vttest_02_01.typescript"); + let mut parser = vt100::Parser::new(24, 80, 0); + parser.process(stream); + parser.screen().clone() +}); + +static VTTEST_02_02: Lazy = Lazy::new(|| { + let stream = include_bytes!("../test/typescript/vttest_02_02.typescript"); + let mut parser = vt100::Parser::new(24, 80, 0); + parser.process(stream); + parser.screen().clone() +}); + +static VTTEST_02_03: Lazy = Lazy::new(|| { + let stream = include_bytes!("../test/typescript/vttest_02_03.typescript"); + let mut parser = vt100::Parser::new(24, 80, 0); + parser.process(stream); + parser.screen().clone() +}); + +static VTTEST_02_04: Lazy = Lazy::new(|| { + let stream = include_bytes!("../test/typescript/vttest_02_04.typescript"); + let mut parser = vt100::Parser::new(24, 80, 0); + parser.process(stream); + parser.screen().clone() +}); + +static VTTEST_02_05: Lazy = Lazy::new(|| { + let stream = include_bytes!("../test/typescript/vttest_02_05.typescript"); + let mut parser = vt100::Parser::new(24, 80, 0); + parser.process(stream); + parser.screen().clone() +}); + +static VTTEST_02_06: Lazy = Lazy::new(|| { + let stream = include_bytes!("../test/typescript/vttest_02_06.typescript"); + let mut parser = vt100::Parser::new(24, 80, 0); + parser.process(stream); + parser.screen().clone() +}); + +static VTTEST_02_07: Lazy = Lazy::new(|| { + let stream = include_bytes!("../test/typescript/vttest_02_07.typescript"); + let mut parser = vt100::Parser::new(24, 80, 0); + parser.process(stream); + parser.screen().clone() +}); + +static VTTEST_02_08: Lazy = Lazy::new(|| { + let stream = include_bytes!("../test/typescript/vttest_02_08.typescript"); + let mut parser = vt100::Parser::new(24, 80, 0); + parser.process(stream); + parser.screen().clone() +}); + +static VTTEST_02_09: Lazy = Lazy::new(|| { + let stream = include_bytes!("../test/typescript/vttest_02_09.typescript"); + let mut parser = vt100::Parser::new(24, 80, 0); + parser.process(stream); + parser.screen().clone() +}); + +static VTTEST_02_10: Lazy = Lazy::new(|| { + let stream = include_bytes!("../test/typescript/vttest_02_10.typescript"); + let mut parser = vt100::Parser::new(24, 80, 0); + parser.process(stream); + parser.screen().clone() +}); + +static VTTEST_02_11: Lazy = Lazy::new(|| { + let stream = include_bytes!("../test/typescript/vttest_02_11.typescript"); + let mut parser = vt100::Parser::new(24, 80, 0); + parser.process(stream); + parser.screen().clone() +}); + +static VTTEST_02_12: Lazy = Lazy::new(|| { + let stream = include_bytes!("../test/typescript/vttest_02_12.typescript"); + let mut parser = vt100::Parser::new(24, 80, 0); + parser.process(stream); + parser.screen().clone() +}); + +static VTTEST_02_13: Lazy = Lazy::new(|| { + let stream = include_bytes!("../test/typescript/vttest_02_13.typescript"); + let mut parser = vt100::Parser::new(24, 80, 0); + parser.process(stream); + parser.screen().clone() +}); + +static VTTEST_02_14: Lazy = Lazy::new(|| { + let stream = include_bytes!("../test/typescript/vttest_02_14.typescript"); + let mut parser = vt100::Parser::new(24, 80, 0); + parser.process(stream); + parser.screen().clone() +}); + +static VTTEST_02_15: Lazy = Lazy::new(|| { + let stream = include_bytes!("../test/typescript/vttest_02_15.typescript"); + let mut parser = vt100::Parser::new(24, 80, 0); + parser.process(stream); + parser.screen().clone() +}); + +#[inline] +fn render_typescript(screen: &Screen) { + let backend = TestBackend::new(80, 24); + let mut terminal = Terminal::new(backend).unwrap(); + let pseudo_term = PseudoTerminal::new(screen); + terminal + .draw(|f| { + f.render_widget(pseudo_term, f.size()); + }) + .unwrap(); + let _view = terminal.backend().to_string(); +} + +#[inline] +#[divan::bench] +fn simple_ls() { + render_typescript(&SIMPLE_LS_ACTIONS) +} + +#[inline] +#[divan::bench] +fn vttest_02_01() { + render_typescript(&VTTEST_02_01) +} + +#[inline] +#[divan::bench] +fn vttest_02_02() { + render_typescript(&VTTEST_02_02) +} + +#[inline] +#[divan::bench] +fn vttest_02_03() { + render_typescript(&VTTEST_02_03) +} + +#[inline] +#[divan::bench] +fn vttest_02_04() { + render_typescript(&VTTEST_02_04) +} + +#[inline] +#[divan::bench] +fn vttest_02_05() { + render_typescript(&VTTEST_02_05) +} + +#[inline] +#[divan::bench] +fn vttest_02_06() { + render_typescript(&VTTEST_02_06) +} + +#[inline] +#[divan::bench] +fn vttest_02_07() { + render_typescript(&VTTEST_02_07) +} + +#[inline] +#[divan::bench] +fn vttest_02_08() { + render_typescript(&VTTEST_02_08) +} + +#[inline] +#[divan::bench] +fn vttest_02_09() { + render_typescript(&VTTEST_02_09) +} + +#[inline] +#[divan::bench] +fn vttest_02_10() { + render_typescript(&VTTEST_02_10) +} + +#[inline] +#[divan::bench] +fn vttest_02_11() { + render_typescript(&VTTEST_02_11) +} + +#[inline] +#[divan::bench] +fn vttest_02_12() { + render_typescript(&VTTEST_02_12) +} + +#[inline] +#[divan::bench] +fn vttest_02_13() { + render_typescript(&VTTEST_02_13) +} + +#[inline] +#[divan::bench] +fn vttest_02_14() { + render_typescript(&VTTEST_02_14) +} + +#[inline] +#[divan::bench] +fn vttest_02_15() { + render_typescript(&VTTEST_02_15) +}