Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Walk history for files in parallell #12

Merged
merged 2 commits into from
Dec 7, 2023
Merged

Walk history for files in parallell #12

merged 2 commits into from
Dec 7, 2023

Conversation

alerque
Copy link
Owner

@alerque alerque commented Dec 7, 2023

Closes #9.

This effort is likely fairly futile:

  1. It introduces some overhead of having to do git repo initialization stuff multiple times since libgit2 repos don't support sync.
  2. The real speed hold up is walking history, not iterating files. This will speed things up by a factor of however many cores a system has (minus some overhead) and make it look super busy, but it won't be enough to be really useful for jumbo-size repositories. It might be one order of magnitude faster so I'll probably release it ASAP, but what we really need is several orders of magnitude faster.

Copy link

github-actions bot commented Dec 7, 2023

🤠 Cargo bloat for toolchain stable-x86_64-unknown-linux-gnu 🤠

@@ Size breakdown @@

- Size       3.4 MB
+ Size       3.64 MB  +252.85 KB
- Text Size  1.08 MB
+ Text Size  1.15 MB  +63.28 KB
Size difference per crate

Note: The numbers below are not 100% accurate, use them as a rough estimate.

@@ Breakdown per crate @@

- std              286.51 KB
+ std              311.85 KB
- git_warp_time    38.33 KB
+ git_warp_time    43.56 KB
+ rayon_core       26.07 KB
+ crossbeam_epoch  5.44 KB
+ crossbeam_deque  2.44 KB
Dependency tree
@@ Dependency tree @@
- Count: 335
+ Count: 358

  ├─ clap v4.4.11
  │  ├─ clap_builder v4.4.11
  │  │  ├─ anstream v0.6.4 
  │  │  ├─ anstyle v1.0.4
  │  │  ├─ clap_lex v0.6.0
  │  │  └─ strsim v0.10.0
  │  └─ clap_derive v4.4.7 (proc-macro) 
  ├─ filetime v0.2.23
  │  ├─ cfg-if v1.0.0
  │  └─ libc v0.2.150
  ├─ git2 v0.18.1
  │  ├─ bitflags v2.4.1
  │  ├─ libc v0.2.150
  │  ├─ libgit2-sys v0.16.1+1.7.1
  │  │  ├─ libc v0.2.150
  │  │  ├─ libz-sys v1.1.12
  │  │  │  ├─ libc v0.2.150
  │  │  │  ├─ cc v1.0.83
  │  │  │  │  ├─ jobserver v0.1.27
  │  │  │  │  │  └─ libc v0.2.150
  │  │  │  │  └─ libc v0.2.150
  │  │  │  ├─ pkg-config v0.3.27
  │  │  │  └─ vcpkg v0.2.15
  │  │  ├─ cc v1.0.83 
  │  │  └─ pkg-config v0.3.27
  │  ├─ log v0.4.20
  │  └─ url v2.5.0
  │     ├─ form_urlencoded v1.2.1
  │     │  └─ percent-encoding v2.3.1
  │     ├─ idna v0.5.0
  │     │  ├─ unicode-bidi v0.3.14
  │     │  └─ unicode-normalization v0.1.22
  │     │     └─ tinyvec v1.6.0
  │     │        └─ tinyvec_macros v0.1.1
  │     └─ percent-encoding v2.3.1
+ ├─ hashbrown v0.14.3
+ │  ├─ ahash v0.8.6
+ │  │  ├─ cfg-if v1.0.0
+ │  │  ├─ once_cell v1.18.0
+ │  │  ├─ zerocopy v0.7.25
+ │  │  └─ version_check v0.9.4
+ │  ├─ allocator-api2 v0.2.16
+ │  └─ rayon v1.8.0
+ │     ├─ either v1.9.0
+ │     └─ rayon-core v1.12.0
+ │        ├─ crossbeam-deque v0.8.3
+ │        │  ├─ cfg-if v1.0.0
+ │        │  ├─ crossbeam-epoch v0.9.15
+ │        │  │  ├─ cfg-if v1.0.0
+ │        │  │  ├─ crossbeam-utils v0.8.16
+ │        │  │  │  └─ cfg-if v1.0.0
+ │        │  │  ├─ memoffset v0.9.0
+ │        │  │  │  └─ autocfg v1.1.0
+ │        │  │  ├─ scopeguard v1.2.0
+ │        │  │  └─ autocfg v1.1.0
+ │        │  └─ crossbeam-utils v0.8.16 
+ │        └─ crossbeam-utils v0.8.16 
+ ├─ rayon v1.8.0 
  ├─ clap_complete v4.4.4
  │  └─ clap v4.4.11 
  ├─ clap_mangen v0.2.15
  │  ├─ clap v4.4.11 
  │  └─ roff v0.2.1
  └─ vergen v8.2.6
     ├─ anyhow v1.0.75
     ├─ gix v0.55.2
     │  ├─ gix-actor v0.28.1
     │  │  ├─ bstr v1.8.0
     │  │  │  ├─ memchr v2.6.4
     │  │  │  └─ regex-automata v0.4.3
     │  │  ├─ btoi v0.4.3
     │  │  │  └─ num-traits v0.2.17
     │  │  │     └─ autocfg v1.1.0
     │  │  ├─ gix-date v0.8.1
     │  │  │  ├─ bstr v1.8.0 
     │  │  │  ├─ itoa v1.0.9
     │  │  │  ├─ thiserror v1.0.50
     │  │  │  │  └─ thiserror-impl v1.0.50 (proc-macro)
     │  │  │  │     ├─ proc-macro2 v1.0.70 
     │  │  │  │     ├─ quote v1.0.33 
     │  │  │  │     └─ syn v2.0.39 
     │  │  │  └─ time v0.3.30
     │  │  │     ├─ deranged v0.3.10
     │  │  │     │  └─ powerfmt v0.2.0
     │  │  │     ├─ itoa v1.0.9
     │  │  │     ├─ libc v0.2.150
     │  │  │     ├─ num_threads v0.1.6
     │  │  │     ├─ powerfmt v0.2.0
     │  │  │     ├─ time-core v0.1.2
     │  │  │     └─ time-macros v0.2.15 (proc-macro)
     │  │  │        └─ time-core v0.1.2
     │  │  ├─ itoa v1.0.9
     │  │  ├─ thiserror v1.0.50 
     │  │  └─ winnow v0.5.25
     │  │     └─ memchr v2.6.4
     │  ├─ gix-commitgraph v0.22.1
     │  │  ├─ bstr v1.8.0 
     │  │  ├─ gix-chunk v0.4.5
     │  │  │  └─ thiserror v1.0.50 
     │  │  ├─ gix-features v0.36.1
     │  │  │  ├─ crc32fast v1.3.2
     │  │  │  │  └─ cfg-if v1.0.0
     │  │  │  ├─ flate2 v1.0.28
     │  │  │  │  ├─ crc32fast v1.3.2 
     │  │  │  │  └─ miniz_oxide v0.7.1
     │  │  │  │     └─ adler v1.0.2
     │  │  │  ├─ gix-hash v0.13.2
     │  │  │  │  ├─ faster-hex v0.8.1
     │  │  │  │  │  └─ serde v1.0.193
     │  │  │  │  └─ thiserror v1.0.50 
     │  │  │  ├─ gix-trace v0.1.4
     │  │  │  ├─ libc v0.2.150
     │  │  │  ├─ once_cell v1.18.0
     │  │  │  ├─ prodash v26.2.2
     │  │  │  ├─ sha1_smol v1.0.0
     │  │  │  ├─ thiserror v1.0.50 
     │  │  │  └─ walkdir v2.4.0
     │  │  │     └─ same-file v1.0.6
     │  │  ├─ gix-hash v0.13.2 
     │  │  ├─ memmap2 v0.9.0
     │  │  │  └─ libc v0.2.150
     │  │  └─ thiserror v1.0.50 
     │  ├─ gix-config v0.31.0
     │  │  ├─ bstr v1.8.0 
     │  │  ├─ gix-config-value v0.14.1
     │  │  │  ├─ bitflags v2.4.1
     │  │  │  ├─ bstr v1.8.0 
     │  │  │  ├─ gix-path v0.10.1
     │  │  │  │  ├─ bstr v1.8.0 
     │  │  │  │  ├─ gix-trace v0.1.4
     │  │  │  │  ├─ home v0.5.5
     │  │  │  │  ├─ once_cell v1.18.0
     │  │  │  │  └─ thiserror v1.0.50 
     │  │  │  ├─ libc v0.2.150
     │  │  │  └─ thiserror v1.0.50 
     │  │  ├─ gix-features v0.36.1 
     │  │  ├─ gix-glob v0.14.1
     │  │  │  ├─ bitflags v2.4.1
     │  │  │  ├─ bstr v1.8.0 
     │  │  │  ├─ gix-features v0.36.1 
     │  │  │  └─ gix-path v0.10.1 
     │  │  ├─ gix-path v0.10.1 
     │  │  ├─ gix-ref v0.38.0
     │  │  │  ├─ gix-actor v0.28.1 
     │  │  │  ├─ gix-date v0.8.1 
     │  │  │  ├─ gix-features v0.36.1 
     │  │  │  ├─ gix-fs v0.8.1
     │  │  │  │  └─ gix-features v0.36.1 
     │  │  │  ├─ gix-hash v0.13.2 
     │  │  │  ├─ gix-lock v11.0.1
     │  │  │  │  ├─ gix-tempfile v11.0.1
     │  │  │  │  │  ├─ gix-fs v0.8.1 
     │  │  │  │  │  ├─ libc v0.2.150
     │  │  │  │  │  ├─ once_cell v1.18.0
     │  │  │  │  │  ├─ parking_lot v0.12.1
     │  │  │  │  │  │  ├─ lock_api v0.4.11
     │  │  │  │  │  │  │  ├─ scopeguard v1.2.0
     │  │  │  │  │  │  │  └─ autocfg v1.1.0
     │  │  │  │  │  │  └─ parking_lot_core v0.9.9
     │  │  │  │  │  │     ├─ cfg-if v1.0.0
     │  │  │  │  │  │     ├─ libc v0.2.150
     │  │  │  │  │  │     └─ smallvec v1.11.2
     │  │  │  │  │  ├─ signal-hook v0.3.17
     │  │  │  │  │  │  ├─ libc v0.2.150
     │  │  │  │  │  │  └─ signal-hook-registry v1.4.1
     │  │  │  │  │  │     └─ libc v0.2.150
     │  │  │  │  │  ├─ signal-hook-registry v1.4.1 
     │  │  │  │  │  └─ tempfile v3.8.1
     │  │  │  │  │     ├─ cfg-if v1.0.0
     │  │  │  │  │     ├─ fastrand v2.0.1
     │  │  │  │  │     └─ rustix v0.38.26
     │  │  │  │  │        ├─ bitflags v2.4.1
     │  │  │  │  │        └─ linux-raw-sys v0.4.12
     │  │  │  │  ├─ gix-utils v0.1.6
     │  │  │  │  │  └─ fastrand v2.0.1
     │  │  │  │  └─ thiserror v1.0.50 
     │  │  │  ├─ gix-object v0.38.0
     │  │  │  │  ├─ bstr v1.8.0 
     │  │  │  │  ├─ btoi v0.4.3 
     │  │  │  │  ├─ gix-actor v0.28.1 
     │  │  │  │  ├─ gix-date v0.8.1 
     │  │  │  │  ├─ gix-features v0.36.1 
     │  │  │  │  ├─ gix-hash v0.13.2 
     │  │  │  │  ├─ gix-validate v0.8.1
     │  │  │  │  │  ├─ bstr v1.8.0 
     │  │  │  │  │  └─ thiserror v1.0.50 
     │  │  │  │  ├─ itoa v1.0.9
     │  │  │  │  ├─ smallvec v1.11.2
     │  │  │  │  ├─ thiserror v1.0.50 
     │  │  │  │  └─ winnow v0.5.25 
     │  │  │  ├─ gix-path v0.10.1 
     │  │  │  ├─ gix-tempfile v11.0.1 
     │  │  │  ├─ gix-validate v0.8.1 
     │  │  │  ├─ memmap2 v0.7.1
     │  │  │  │  └─ libc v0.2.150
     │  │  │  ├─ thiserror v1.0.50 
     │  │  │  └─ winnow v0.5.25 
     │  │  ├─ gix-sec v0.10.1
     │  │  │  ├─ bitflags v2.4.1
     │  │  │  └─ libc v0.2.150
     │  │  ├─ memchr v2.6.4
     │  │  ├─ once_cell v1.18.0
     │  │  ├─ smallvec v1.11.2
     │  │  ├─ thiserror v1.0.50 
     │  │  ├─ unicode-bom v2.0.3
     │  │  └─ winnow v0.5.25 
     │  ├─ gix-date v0.8.1 
     │  ├─ gix-diff v0.37.0
     │  │  ├─ gix-hash v0.13.2 
     │  │  ├─ gix-object v0.38.0 
     │  │  └─ thiserror v1.0.50 
     │  ├─ gix-discover v0.26.0
     │  │  ├─ bstr v1.8.0 
     │  │  ├─ gix-hash v0.13.2 
     │  │  ├─ gix-path v0.10.1 
     │  │  ├─ gix-ref v0.38.0 
     │  │  ├─ gix-sec v0.10.1 
     │  │  └─ thiserror v1.0.50 
     │  ├─ gix-features v0.36.1 
     │  ├─ gix-fs v0.8.1 
     │  ├─ gix-glob v0.14.1 
     │  ├─ gix-hash v0.13.2 
     │  ├─ gix-hashtable v0.4.1
     │  │  ├─ gix-hash v0.13.2 
     │  │  ├─ hashbrown v0.14.3
     │  │  └─ parking_lot v0.12.1 
     │  ├─ gix-index v0.26.0
     │  │  ├─ bitflags v2.4.1
     │  │  ├─ bstr v1.8.0 
     │  │  ├─ btoi v0.4.3 
     │  │  ├─ filetime v0.2.23 
     │  │  ├─ gix-bitmap v0.2.8
     │  │  │  └─ thiserror v1.0.50 
     │  │  ├─ gix-features v0.36.1 
     │  │  ├─ gix-fs v0.8.1 
     │  │  ├─ gix-hash v0.13.2 
     │  │  ├─ gix-lock v11.0.1 
     │  │  ├─ gix-object v0.38.0 
     │  │  ├─ gix-traverse v0.34.0
     │  │  │  ├─ gix-commitgraph v0.22.1 
     │  │  │  ├─ gix-date v0.8.1 
     │  │  │  ├─ gix-hash v0.13.2 
     │  │  │  ├─ gix-hashtable v0.4.1 
     │  │  │  ├─ gix-object v0.38.0 
     │  │  │  ├─ gix-revwalk v0.9.0
     │  │  │  │  ├─ gix-commitgraph v0.22.1 
     │  │  │  │  ├─ gix-date v0.8.1 
     │  │  │  │  ├─ gix-hash v0.13.2 
     │  │  │  │  ├─ gix-hashtable v0.4.1 
     │  │  │  │  ├─ gix-object v0.38.0 
     │  │  │  │  ├─ smallvec v1.11.2
     │  │  │  │  └─ thiserror v1.0.50 
     │  │  │  ├─ smallvec v1.11.2
     │  │  │  └─ thiserror v1.0.50 
     │  │  ├─ itoa v1.0.9
     │  │  ├─ memmap2 v0.7.1 
     │  │  ├─ smallvec v1.11.2
     │  │  └─ thiserror v1.0.50 
     │  ├─ gix-lock v11.0.1 
     │  ├─ gix-macros v0.1.1 (proc-macro)
     │  │  ├─ proc-macro2 v1.0.70 
     │  │  ├─ quote v1.0.33 
     │  │  └─ syn v2.0.39 
     │  ├─ gix-object v0.38.0 
     │  ├─ gix-odb v0.54.0
     │  │  ├─ arc-swap v1.6.0
     │  │  ├─ gix-date v0.8.1 
     │  │  ├─ gix-features v0.36.1 
     │  │  ├─ gix-hash v0.13.2 
     │  │  ├─ gix-object v0.38.0 
     │  │  ├─ gix-pack v0.44.0
     │  │  │  ├─ clru v0.6.1
     │  │  │  ├─ gix-chunk v0.4.5 
     │  │  │  ├─ gix-features v0.36.1 
     │  │  │  ├─ gix-hash v0.13.2 
     │  │  │  ├─ gix-hashtable v0.4.1 
     │  │  │  ├─ gix-object v0.38.0 
     │  │  │  ├─ gix-path v0.10.1 
     │  │  │  ├─ gix-tempfile v11.0.1 
     │  │  │  ├─ memmap2 v0.7.1 
     │  │  │  ├─ parking_lot v0.12.1 
     │  │  │  ├─ smallvec v1.11.2
     │  │  │  └─ thiserror v1.0.50 
     │  │  ├─ gix-path v0.10.1 
     │  │  ├─ gix-quote v0.4.8
     │  │  │  ├─ bstr v1.8.0 
     │  │  │  ├─ btoi v0.4.3 
     │  │  │  └─ thiserror v1.0.50 
     │  │  ├─ parking_lot v0.12.1 
     │  │  ├─ tempfile v3.8.1 
     │  │  └─ thiserror v1.0.50 
     │  ├─ gix-pack v0.44.0 
     │  ├─ gix-path v0.10.1 
     │  ├─ gix-ref v0.38.0 
     │  ├─ gix-refspec v0.19.0
     │  │  ├─ bstr v1.8.0 
     │  │  ├─ gix-hash v0.13.2 
     │  │  ├─ gix-revision v0.23.0
     │  │  │  ├─ bstr v1.8.0 
     │  │  │  ├─ gix-date v0.8.1 
     │  │  │  ├─ gix-hash v0.13.2 
     │  │  │  ├─ gix-hashtable v0.4.1 
     │  │  │  ├─ gix-object v0.38.0 
     │  │  │  ├─ gix-revwalk v0.9.0 
     │  │  │  ├─ gix-trace v0.1.4
     │  │  │  └─ thiserror v1.0.50 
     │  │  ├─ gix-validate v0.8.1 
     │  │  ├─ smallvec v1.11.2
     │  │  └─ thiserror v1.0.50 
     │  ├─ gix-revision v0.23.0 
     │  ├─ gix-revwalk v0.9.0 
     │  ├─ gix-sec v0.10.1 
     │  ├─ gix-tempfile v11.0.1 
     │  ├─ gix-trace v0.1.4
     │  ├─ gix-traverse v0.34.0 
     │  ├─ gix-url v0.25.2
     │  │  ├─ bstr v1.8.0 
     │  │  ├─ gix-features v0.36.1 
     │  │  ├─ gix-path v0.10.1 
     │  │  ├─ home v0.5.5
     │  │  ├─ thiserror v1.0.50 
     │  │  └─ url v2.5.0 
     │  ├─ gix-utils v0.1.6 
     │  ├─ gix-validate v0.8.1 
     │  ├─ once_cell v1.18.0
     │  ├─ parking_lot v0.12.1 
     │  ├─ signal-hook v0.3.17 
     │  ├─ smallvec v1.11.2
     │  └─ thiserror v1.0.50 
     ├─ time v0.3.30 
     └─ rustversion v1.0.14 (proc-macro)

Commit: fc80325 (Compare with baseline commit)

@alerque
Copy link
Owner Author

alerque commented Dec 7, 2023

On my system with 12 cores this clocks in at 7× faster (tested with repos in the 1k wide by 2k deep range). That's a lot less than a theoretical gain of 11× because of the libgit2 instantiation overhead, but 7× is better than 1×. I'll release this now and then have a look at a different algorithm that might actually fix #11.

@alerque alerque merged commit 580a8f1 into master Dec 7, 2023
10 checks passed
@alerque alerque deleted the rayon branch December 7, 2023 10:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Paralellize operations
1 participant