From e8ce092df71abfbc5feab41b8458261e82d94ac2 Mon Sep 17 00:00:00 2001 From: Ed Page Date: Mon, 9 Sep 2024 10:03:56 -0500 Subject: [PATCH] perf: Offer 'simd' feature for faster folding MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ```console $ cargo bench && cargo bench -F simd Compiling annotate-snippets v0.11.2 (/home/epage/src/personal/annotate-snippets-rs) Finished `bench` profile [optimized] target(s) in 0.99s Running unittests src/lib.rs (target/release/deps/annotate_snippets-b51bb37991a7f496) running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Running benches/bench.rs (target/release/deps/bench-468ba612503afee1) Timer precision: 18 ns bench fastest │ slowest │ median │ mean │ samples │ iters ├─ fold │ │ │ │ │ │ ├─ 0 1.911 µs │ 19.44 µs │ 1.943 µs │ 2.146 µs │ 100 │ 100 │ ├─ 1 1.916 µs │ 3.158 µs │ 1.973 µs │ 1.982 µs │ 100 │ 100 │ ├─ 10 2.121 µs │ 6.05 µs │ 2.225 µs │ 2.281 µs │ 100 │ 100 │ ├─ 100 3.706 µs │ 7.007 µs │ 3.83 µs │ 3.876 µs │ 100 │ 100 │ ├─ 1000 19.42 µs │ 25.61 µs │ 19.48 µs │ 19.64 µs │ 100 │ 100 │ ├─ 10000 111.2 µs │ 204.2 µs │ 127 µs │ 133.6 µs │ 100 │ 100 │ ╰─ 100000 1.094 ms │ 1.747 ms │ 1.137 ms │ 1.158 ms │ 100 │ 100 ╰─ simple 10.14 µs │ 40.27 µs │ 10.5 µs │ 11.01 µs │ 100 │ 100 Compiling annotate-snippets v0.11.2 (/home/epage/src/personal/annotate-snippets-rs) Finished `bench` profile [optimized] target(s) in 0.99s Running unittests src/lib.rs (target/release/deps/annotate_snippets-9d4024ac94675e6a) running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Running benches/bench.rs (target/release/deps/bench-d5470149969acbb8) Timer precision: 13 ns bench fastest │ slowest │ median │ mean │ samples │ iters ├─ fold │ │ │ │ │ │ ├─ 0 1.164 µs │ 13.91 µs │ 1.208 µs │ 1.408 µs │ 100 │ 100 │ ├─ 1 1.188 µs │ 4.289 µs │ 1.234 µs │ 1.277 µs │ 100 │ 100 │ ├─ 10 1.259 µs │ 3.822 µs │ 1.319 µs │ 1.419 µs │ 100 │ 100 │ ├─ 100 1.312 µs │ 2.732 µs │ 1.412 µs │ 1.519 µs │ 100 │ 100 │ ├─ 1000 1.917 µs │ 5.52 µs │ 2 µs │ 2.085 µs │ 100 │ 100 │ ├─ 10000 7.195 µs │ 29.55 µs │ 7.325 µs │ 7.638 µs │ 100 │ 100 │ ╰─ 100000 59.08 µs │ 403 µs │ 61.1 µs │ 65.52 µs │ 100 │ 100 ╰─ simple 9.92 µs │ 19.09 µs │ 10.33 µs │ 10.91 µs │ 100 │ 100 ``` --- Cargo.lock | 5 +++-- Cargo.toml | 2 ++ src/renderer/display_list.rs | 13 ++++++++++++- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ffaa43e..02b8812 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -20,6 +20,7 @@ dependencies = [ "difference", "divan", "glob", + "memchr", "serde", "snapbox", "toml", @@ -393,9 +394,9 @@ checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" [[package]] name = "memchr" -version = "2.7.2" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "normalize-line-endings" diff --git a/Cargo.toml b/Cargo.toml index 2b72bd9..d59fa9f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -25,6 +25,7 @@ maintenance = { status = "actively-developed" } [dependencies] anstyle = "1.0.4" +memchr = { version = "2.7.4", optional = true } unicode-width = "0.1.11" [dev-dependencies] @@ -47,6 +48,7 @@ harness = false [features] default = [] +simd = ["memchr"] testing-colors = [] [lints.rust] diff --git a/src/renderer/display_list.rs b/src/renderer/display_list.rs index d94a660..b5fef26 100644 --- a/src/renderer/display_list.rs +++ b/src/renderer/display_list.rs @@ -893,7 +893,7 @@ fn fold_prefix_suffix(mut snippet: snippet::Snippet<'_>) -> snippet::Snippet<'_> if let Some(before_new_start) = snippet.source[0..ann_start].rfind('\n') { let new_start = before_new_start + 1; - let line_offset = snippet.source[..new_start].lines().count(); + let line_offset = newline_count(&snippet.source[..new_start]); snippet.line_start += line_offset; snippet.source = &snippet.source[new_start..]; @@ -919,6 +919,17 @@ fn fold_prefix_suffix(mut snippet: snippet::Snippet<'_>) -> snippet::Snippet<'_> snippet } +fn newline_count(body: &str) -> usize { + #[cfg(feature = "simd")] + { + memchr::memchr_iter(b'\n', body.as_bytes()).count() + } + #[cfg(not(feature = "simd"))] + { + body.lines().count() + } +} + fn fold_body(body: Vec>) -> Vec> { const INNER_CONTEXT: usize = 1; const INNER_UNFOLD_SIZE: usize = INNER_CONTEXT * 2 + 1;