[vcpkg] Make Filesystem::remove_all faster #7570
I added benchmarks to measure how fast the parallel remove_all code was
-- it turns out, about 3x slower than stdfs::remove_all. Since this was
the case, I removed all of the parallelism and rewrote it serially, and
ended up about 30% faster than stdfs::remove_all (in addition to
supporting symlinks).
In addition, I did the following three orthogonal changes:
- simplified the work queue, basing it on Billy O'Neal's idea
- Fix warnings on older versions of compilers in tests, by splitting
the pragmas out of pch.h.
- Ran clang-format on some files
In fixing up remove_all, the following changes were made:
- On Windows, regular symlinks and directory symlinks are distinct;
as an example, to remove directory symlinks (and junctions, for that
matter), one must use RemoveDirectory. Only on Windows, I added new
`file_type` and `file_status` types, with `file_type` including a new
`directory_symlink` enumerator, and `file_status` being exactly the
same as the old one except using the new `file_type`. On Unix, I
didn't make that change since they don't make a distinction.
- I added new `symlink_status` and `status` functions which use the
new `file_status` on Windows.
- I made `Filesystem::exists` call `fs::exists(status(p))`, as opposed
to the old version which called `stdfs::exists` directly.
- Added benchmarks to `vcpkg-test/files.cpp`. They test the
performance of `remove_all` on small directories (~20 files), with
symlinks and without, and on large directories (~2000 files), with
symlinks and without.
2019-08-02 16:49:45 -07:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#if defined(_MSC_VER) && _MSC_VER < 1911
|
|
|
|
// [[nodiscard]] is not recognized before VS 2017 version 15.3
|
|
|
|
#pragma warning(disable : 5030)
|
|
|
|
#endif
|
|
|
|
|
2020-04-17 18:16:20 -07:00
|
|
|
#if defined(_MSC_VER) && _MSC_VER < 1910
|
|
|
|
// https://docs.microsoft.com/en-us/cpp/error-messages/compiler-warnings/compiler-warning-level-3-c4800?view=vs-2019
|
|
|
|
#pragma warning(disable : 4800)
|
|
|
|
#endif
|
|
|
|
|
[vcpkg] Make Filesystem::remove_all faster #7570
I added benchmarks to measure how fast the parallel remove_all code was
-- it turns out, about 3x slower than stdfs::remove_all. Since this was
the case, I removed all of the parallelism and rewrote it serially, and
ended up about 30% faster than stdfs::remove_all (in addition to
supporting symlinks).
In addition, I did the following three orthogonal changes:
- simplified the work queue, basing it on Billy O'Neal's idea
- Fix warnings on older versions of compilers in tests, by splitting
the pragmas out of pch.h.
- Ran clang-format on some files
In fixing up remove_all, the following changes were made:
- On Windows, regular symlinks and directory symlinks are distinct;
as an example, to remove directory symlinks (and junctions, for that
matter), one must use RemoveDirectory. Only on Windows, I added new
`file_type` and `file_status` types, with `file_type` including a new
`directory_symlink` enumerator, and `file_status` being exactly the
same as the old one except using the new `file_type`. On Unix, I
didn't make that change since they don't make a distinction.
- I added new `symlink_status` and `status` functions which use the
new `file_status` on Windows.
- I made `Filesystem::exists` call `fs::exists(status(p))`, as opposed
to the old version which called `stdfs::exists` directly.
- Added benchmarks to `vcpkg-test/files.cpp`. They test the
performance of `remove_all` on small directories (~20 files), with
symlinks and without, and on large directories (~2000 files), with
symlinks and without.
2019-08-02 16:49:45 -07:00
|
|
|
#if defined(__GNUC__) && __GNUC__ < 7
|
|
|
|
// [[nodiscard]] is not recognized before GCC version 7
|
|
|
|
#pragma GCC diagnostic ignored "-Wattributes"
|
|
|
|
#endif
|
2020-05-14 12:49:31 -07:00
|
|
|
|
|
|
|
#if defined(_MSC_VER)
|
|
|
|
#include <sal.h>
|
|
|
|
#endif
|
|
|
|
|
2020-06-22 14:14:36 -07:00
|
|
|
#if defined(_MSC_VER)
|
|
|
|
#define ASSUME(expr) __assume(expr)
|
|
|
|
#else
|
|
|
|
#define ASSUME(expr)
|
2020-05-14 12:49:31 -07:00
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef _MSC_VER
|
|
|
|
#define VCPKG_MSVC_WARNING(...) __pragma(warning(__VA_ARGS__))
|
|
|
|
#define GCC_DIAGNOSTIC(...)
|
|
|
|
#else
|
|
|
|
#define VCPKG_MSVC_WARNING(...)
|
|
|
|
#define GCC_DIAGNOSTIC(...) _Pragma("diagnostic " #__VA_ARGS__)
|
|
|
|
#endif
|