Skip to content

Commit

Permalink
perf: Offer 'simd' feature for faster folding
Browse files Browse the repository at this point in the history
```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
```
  • Loading branch information
epage committed Sep 9, 2024
1 parent a4cca36 commit e8ce092
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 3 deletions.
5 changes: 3 additions & 2 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand All @@ -47,6 +48,7 @@ harness = false

[features]
default = []
simd = ["memchr"]
testing-colors = []

[lints.rust]
Expand Down
13 changes: 12 additions & 1 deletion src/renderer/display_list.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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..];
Expand All @@ -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<DisplayLine<'_>>) -> Vec<DisplayLine<'_>> {
const INNER_CONTEXT: usize = 1;
const INNER_UNFOLD_SIZE: usize = INNER_CONTEXT * 2 + 1;
Expand Down

0 comments on commit e8ce092

Please sign in to comment.