diff --git a/.github/workflows/CICD.yml b/.github/workflows/CICD.yml index e3182b3d3..228dbb4d0 100644 --- a/.github/workflows/CICD.yml +++ b/.github/workflows/CICD.yml @@ -209,7 +209,7 @@ jobs: DPKG_BASENAME=${{ needs.crate_metadata.outputs.name }} DPKG_CONFLICTS=${{ needs.crate_metadata.outputs.name }}-musl - case ${{ matrix.job.target }} in *-musl) DPKG_BASENAME=${{ needs.crate_metadata.outputs.name }}-musl ; DPKG_CONFLICTS=${{ needs.crate_metadata.outputs.name }} ;; esac; + case ${{ matrix.job.target }} in *-musl*) DPKG_BASENAME=${{ needs.crate_metadata.outputs.name }}-musl ; DPKG_CONFLICTS=${{ needs.crate_metadata.outputs.name }} ;; esac; DPKG_VERSION=${{ needs.crate_metadata.outputs.version }} unset DPKG_ARCH diff --git a/CHANGELOG.md b/CHANGELOG.md index 31ca18fe2..2da02ecd4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,21 @@ -# Upcoming release +# v9.0.0 + +## Performance + +- Performance has been *significantly improved*, both due to optimizations in the underlying `ignore` + crate (#1429), and in `fd` itself (#1422, #1408, #13620) - @tavianator. + [Benchmarks results](https://gist.github.com/tavianator/32edbe052f33ef60570cf5456b59de81) show gains + of 6-8x for full traversals of smaller directories (100k files) and up to 13x for larger directories (1M files). + +- The default number of threads is now constrained to be at most 64. This should improve startup time on + systems with many CPU cores. (#1203, #1410, #1412, #1431) - @tmccombs and @tavianator + +- New flushing behavior when writing output to stdout, providing better performance for TTY and non-TTY + use cases, see #1452 and #1313 (@tavianator). ## Features +- Support character and block device file types, see #1213 and #1336 (@cgzones) - Breaking: `.git/` is now ignored by default when using `--hidden` / `-H`, use `--no-ignore` / `-I` or `--no-ignore-vcs` to override, see #1387 and #1396 (@skoriop) @@ -9,15 +23,15 @@ - Fix `NO_COLOR` support, see #1421 (@acuteenvy) -## Changes +## Other -- Performance has been significantly improved, both due to optimizations in the underlying `ignore` - crate (#1429), and in `fd` itself (#1422). +- Fixed documentation typos, see #1409 (@marcospb19) + +## Thanks + +Special thanks to @tavianator for his incredible work on performance in the `ignore` crate and `fd` itself. -- The default number of threads is now constrained to be at most 64. This should improve startup time on - systems with many CPU cores. (#1203, #1412, #1431) -## Other # v8.7.1 diff --git a/Cargo.lock b/Cargo.lock index c28b0ebaa..cb159cb74 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -313,7 +313,7 @@ checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" [[package]] name = "fd-find" -version = "8.7.1" +version = "9.0.0" dependencies = [ "aho-corasick", "anyhow", diff --git a/Cargo.toml b/Cargo.toml index 77c1d0982..6ca9f90a2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,7 +16,7 @@ license = "MIT OR Apache-2.0" name = "fd-find" readme = "README.md" repository = "https://github.com/sharkdp/fd" -version = "8.7.1" +version = "9.0.0" edition= "2021" rust-version = "1.70.0" diff --git a/README.md b/README.md index 3611e8761..2e89126fe 100644 --- a/README.md +++ b/README.md @@ -314,8 +314,8 @@ Options: -d, --max-depth Set maximum search depth (default: none) -E, --exclude Exclude entries that match the given glob pattern -t, --type Filter by type: file (f), directory (d), symlink (l), - executable (x), empty (e), socket (s), pipe (p), - block-device (b), char-device (c) + executable (x), empty (e), socket (s), pipe (p), char-device + (c), block-device (b) -e, --extension Filter by file extension -S, --size Limit results based on the size of files --changed-within Filter by file modification time (newer than) @@ -331,61 +331,45 @@ Options: ## Benchmark -Let's search my home folder for files that end in `[0-9].jpg`. It contains ~190.000 -subdirectories and about a million files. For averaging and statistical analysis, I'm using +Let's search my home folder for files that end in `[0-9].jpg`. It contains ~750.000 +subdirectories and about a 4 million files. For averaging and statistical analysis, I'm using [hyperfine](https://github.com/sharkdp/hyperfine). The following benchmarks are performed with a "warm"/pre-filled disk-cache (results for a "cold" disk-cache show the same trends). Let's start with `find`: ``` -Benchmark #1: find ~ -iregex '.*[0-9]\.jpg$' - - Time (mean ± σ): 7.236 s ± 0.090 s - - Range (min … max): 7.133 s … 7.385 s +Benchmark 1: find ~ -iregex '.*[0-9]\.jpg$' + Time (mean ± σ): 19.922 s ± 0.109 s + Range (min … max): 19.765 s … 20.065 s ``` `find` is much faster if it does not need to perform a regular-expression search: ``` -Benchmark #2: find ~ -iname '*[0-9].jpg' - - Time (mean ± σ): 3.914 s ± 0.027 s - - Range (min … max): 3.876 s … 3.964 s +Benchmark 2: find ~ -iname '*[0-9].jpg' + Time (mean ± σ): 11.226 s ± 0.104 s + Range (min … max): 11.119 s … 11.466 s ``` -Now let's try the same for `fd`. Note that `fd` *always* performs a regular expression -search. The options `--hidden` and `--no-ignore` are needed for a fair comparison, -otherwise `fd` does not have to traverse hidden folders and ignored paths (see below): +Now let's try the same for `fd`. Note that `fd` performs a regular expression +search by defautl. The options `-u`/`--unrestricted` option is needed here for +a fair comparison. Otherwise `fd` does not have to traverse hidden folders and +ignored paths (see below): ``` -Benchmark #3: fd -HI '.*[0-9]\.jpg$' ~ - - Time (mean ± σ): 811.6 ms ± 26.9 ms - - Range (min … max): 786.0 ms … 870.7 ms -``` -For this particular example, `fd` is approximately nine times faster than `find -iregex` -and about five times faster than `find -iname`. By the way, both tools found the exact -same 20880 files :smile:. - -Finally, let's run `fd` without `--hidden` and `--no-ignore` (this can lead to different -search results, of course). If *fd* does not have to traverse the hidden and git-ignored -folders, it is almost an order of magnitude faster: -``` -Benchmark #4: fd '[0-9]\.jpg$' ~ - - Time (mean ± σ): 123.7 ms ± 6.0 ms - - Range (min … max): 118.8 ms … 140.0 ms +Benchmark 3: fd -u '[0-9]\.jpg$' ~ + Time (mean ± σ): 854.8 ms ± 10.0 ms + Range (min … max): 839.2 ms … 868.9 ms ``` +For this particular example, `fd` is approximately **23 times faster** than `find -iregex` +and about **13 times faster** than `find -iname`. By the way, both tools found the exact +same 546 files :smile:. -**Note**: This is *one particular* benchmark on *one particular* machine. While I have -performed quite a lot of different tests (and found consistent results), things might -be different for you! I encourage everyone to try it out on their own. See +**Note**: This is *one particular* benchmark on *one particular* machine. While we have +performed a lot of different tests (and found consistent results), things might +be different for you! We encourage everyone to try it out on their own. See [this repository](https://github.com/sharkdp/fd-benchmarks) for all necessary scripts. -Concerning *fd*'s speed, the main credit goes to the `regex` and `ignore` crates that are also used -in [ripgrep](https://github.com/BurntSushi/ripgrep) (check it out!). +Concerning *fd*'s speed, a lot of credit goes to the `regex` and `ignore` crates that are +also used in [ripgrep](https://github.com/BurntSushi/ripgrep) (check it out!). ## Troubleshooting @@ -543,7 +527,7 @@ Make sure that `$HOME/.local/bin` is in your `$PATH`. If you use an older version of Ubuntu, you can download the latest `.deb` package from the [release page](https://github.com/sharkdp/fd/releases) and install it via: ``` bash -sudo dpkg -i fd_8.7.1_amd64.deb # adapt version number and architecture +sudo dpkg -i fd_9.0.0_amd64.deb # adapt version number and architecture ``` ### On Debian @@ -677,7 +661,7 @@ With Rust's package manager [cargo](https://github.com/rust-lang/cargo), you can ``` cargo install fd-find ``` -Note that rust version *1.64.0* or later is required. +Note that rust version *1.70.0* or later is required. `make` is also needed for the build. diff --git a/doc/release-checklist.md b/doc/release-checklist.md index b11e75d54..0a20802a7 100644 --- a/doc/release-checklist.md +++ b/doc/release-checklist.md @@ -9,7 +9,7 @@ necessary changes for the upcoming release. - [ ] Update version in `Cargo.toml`. Run `cargo build` to update `Cargo.lock`. Make sure to `git add` the `Cargo.lock` changes as well. - [ ] Find the current min. supported Rust version by running - `grep '^\s*MIN_SUPPORTED_RUST_VERSION' .github/workflows/CICD.yml`. + `grep rust-version Cargo.toml`. - [ ] Update the `fd` version and the min. supported Rust version in `README.md`. - [ ] Update `CHANGELOG.md`. Change the heading of the *"Upcoming release"* section to the version of this release.