From 8ec85d8324b21b7bb44ca212f52a84314708efa7 Mon Sep 17 00:00:00 2001 From: nikola-sh Date: Sat, 9 Nov 2024 19:20:16 +0300 Subject: [PATCH 1/8] fix symlink_status perf --- benchmarks/CMakeLists.txt | 1 + benchmarks/src/filesystem.cpp | 19 +++++++++++++++++++ stl/src/filesystem.cpp | 5 +++++ 3 files changed, 25 insertions(+) create mode 100644 benchmarks/src/filesystem.cpp diff --git a/benchmarks/CMakeLists.txt b/benchmarks/CMakeLists.txt index 0aaca52f99e..f04adc63cdb 100644 --- a/benchmarks/CMakeLists.txt +++ b/benchmarks/CMakeLists.txt @@ -121,6 +121,7 @@ add_benchmark(random_integer_generation src/random_integer_generation.cpp) add_benchmark(replace src/replace.cpp) add_benchmark(std_copy src/std_copy.cpp) add_benchmark(swap_ranges src/swap_ranges.cpp) +add_benchmark(filesystem src/filesystem.cpp) add_benchmark(vector_bool_copy src/std/containers/sequences/vector.bool/copy/test.cpp) add_benchmark(vector_bool_copy_n src/std/containers/sequences/vector.bool/copy_n/test.cpp) diff --git a/benchmarks/src/filesystem.cpp b/benchmarks/src/filesystem.cpp new file mode 100644 index 00000000000..9fd195e17d5 --- /dev/null +++ b/benchmarks/src/filesystem.cpp @@ -0,0 +1,19 @@ +// Copyright (c) Microsoft Corporation. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +#include +#include + +void symlink_status(benchmark::State& state) { + const auto path = std::filesystem::temp_directory_path(); + + for (auto _ : state) { + std::error_code ec; + const auto status = std::filesystem::symlink_status(path, ec); + benchmark::DoNotOptimize(status); + } +} + +BENCHMARK(symlink_status); + +BENCHMARK_MAIN(); diff --git a/stl/src/filesystem.cpp b/stl/src/filesystem.cpp index 5fdde72e6b7..ee23ce57a73 100644 --- a/stl/src/filesystem.cpp +++ b/stl/src/filesystem.cpp @@ -898,6 +898,11 @@ namespace { _Merge_to_ull(_Data.ftLastWriteTime.dwHighDateTime, _Data.ftLastWriteTime.dwLowDateTime)); _Flags &= ~_Get_file_attributes_data; + + if (_STD _Bitmask_includes_any(_Flags, __std_fs_stats_flags::_Reparse_tag)) { + _Stats->_Reparse_point_tag = __std_fs_reparse_tag::_None; + _Flags &= ~__std_fs_stats_flags::_Reparse_tag; + } } } } From 43e904b46a42a601e7a490af253b740a506a5658 Mon Sep 17 00:00:00 2001 From: nikola-sh Date: Sat, 9 Nov 2024 19:32:22 +0300 Subject: [PATCH 2/8] cosmetics --- benchmarks/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/benchmarks/CMakeLists.txt b/benchmarks/CMakeLists.txt index f04adc63cdb..ad6de755aed 100644 --- a/benchmarks/CMakeLists.txt +++ b/benchmarks/CMakeLists.txt @@ -111,6 +111,7 @@ endfunction() add_benchmark(bitset_to_string src/bitset_to_string.cpp) add_benchmark(find_and_count src/find_and_count.cpp) add_benchmark(find_first_of src/find_first_of.cpp) +add_benchmark(filesystem src/filesystem.cpp) add_benchmark(iota src/iota.cpp) add_benchmark(locale_classic src/locale_classic.cpp) add_benchmark(minmax_element src/minmax_element.cpp) @@ -121,7 +122,6 @@ add_benchmark(random_integer_generation src/random_integer_generation.cpp) add_benchmark(replace src/replace.cpp) add_benchmark(std_copy src/std_copy.cpp) add_benchmark(swap_ranges src/swap_ranges.cpp) -add_benchmark(filesystem src/filesystem.cpp) add_benchmark(vector_bool_copy src/std/containers/sequences/vector.bool/copy/test.cpp) add_benchmark(vector_bool_copy_n src/std/containers/sequences/vector.bool/copy_n/test.cpp) From ce3f02364900271172548081ddb433d134360668 Mon Sep 17 00:00:00 2001 From: nikola-sh Date: Sat, 9 Nov 2024 19:37:03 +0300 Subject: [PATCH 3/8] fix --- stl/src/filesystem.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/stl/src/filesystem.cpp b/stl/src/filesystem.cpp index ee23ce57a73..8b8752ecd4b 100644 --- a/stl/src/filesystem.cpp +++ b/stl/src/filesystem.cpp @@ -898,11 +898,12 @@ namespace { _Merge_to_ull(_Data.ftLastWriteTime.dwHighDateTime, _Data.ftLastWriteTime.dwLowDateTime)); _Flags &= ~_Get_file_attributes_data; + } - if (_STD _Bitmask_includes_any(_Flags, __std_fs_stats_flags::_Reparse_tag)) { - _Stats->_Reparse_point_tag = __std_fs_reparse_tag::_None; - _Flags &= ~__std_fs_stats_flags::_Reparse_tag; - } + if (!_STD _Bitmask_includes_any(_Attributes, __std_fs_file_attr::_Reparse_point) + && _STD _Bitmask_includes_any(_Flags, __std_fs_stats_flags::_Reparse_tag)) { + _Stats->_Reparse_point_tag = __std_fs_reparse_tag::_None; + _Flags &= ~__std_fs_stats_flags::_Reparse_tag; } } } From d4263b50e78bbcb3f6639b81ade6382965424855 Mon Sep 17 00:00:00 2001 From: nikola-sh Date: Sat, 9 Nov 2024 22:41:12 +0300 Subject: [PATCH 4/8] comments --- stl/src/filesystem.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/stl/src/filesystem.cpp b/stl/src/filesystem.cpp index 8b8752ecd4b..22dec3d5584 100644 --- a/stl/src/filesystem.cpp +++ b/stl/src/filesystem.cpp @@ -902,6 +902,7 @@ namespace { if (!_STD _Bitmask_includes_any(_Attributes, __std_fs_file_attr::_Reparse_point) && _STD _Bitmask_includes_any(_Flags, __std_fs_stats_flags::_Reparse_tag)) { + // if reparse tag is requested by caller but the file is not a reparse point, set tag to _None _Stats->_Reparse_point_tag = __std_fs_reparse_tag::_None; _Flags &= ~__std_fs_stats_flags::_Reparse_tag; } From 5e5b73a5a4637450d28953db14ce9519ff6a0100 Mon Sep 17 00:00:00 2001 From: nikola-sh Date: Sun, 10 Nov 2024 19:48:47 +0300 Subject: [PATCH 5/8] DoNotOptimize(ec) --- benchmarks/src/filesystem.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/benchmarks/src/filesystem.cpp b/benchmarks/src/filesystem.cpp index 9fd195e17d5..a2d44462f7e 100644 --- a/benchmarks/src/filesystem.cpp +++ b/benchmarks/src/filesystem.cpp @@ -11,6 +11,7 @@ void symlink_status(benchmark::State& state) { std::error_code ec; const auto status = std::filesystem::symlink_status(path, ec); benchmark::DoNotOptimize(status); + benchmark::DoNotOptimize(ec); } } From 57bcb1f22e80ca69d450f6785476cad05ac9369d Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Mon, 11 Nov 2024 07:50:31 -0800 Subject: [PATCH 6/8] Follow sorted order when adding the new benchmark. --- benchmarks/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/benchmarks/CMakeLists.txt b/benchmarks/CMakeLists.txt index edb04e668c1..c0d298d2e1b 100644 --- a/benchmarks/CMakeLists.txt +++ b/benchmarks/CMakeLists.txt @@ -110,9 +110,9 @@ add_benchmark(adjacent_difference src/adjacent_difference.cpp) add_benchmark(bitset_from_string src/bitset_from_string.cpp) add_benchmark(bitset_to_string src/bitset_to_string.cpp) add_benchmark(efficient_nonlocking_print src/efficient_nonlocking_print.cpp) +add_benchmark(filesystem src/filesystem.cpp) add_benchmark(find_and_count src/find_and_count.cpp) add_benchmark(find_first_of src/find_first_of.cpp) -add_benchmark(filesystem src/filesystem.cpp) add_benchmark(iota src/iota.cpp) add_benchmark(locale_classic src/locale_classic.cpp) add_benchmark(minmax_element src/minmax_element.cpp) From 7b36378940b5f47469c6164700e536c3f9d9b0f1 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Mon, 11 Nov 2024 07:53:33 -0800 Subject: [PATCH 7/8] Include `` for `std::error_code`. --- benchmarks/src/filesystem.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/benchmarks/src/filesystem.cpp b/benchmarks/src/filesystem.cpp index a2d44462f7e..0066c796754 100644 --- a/benchmarks/src/filesystem.cpp +++ b/benchmarks/src/filesystem.cpp @@ -3,6 +3,7 @@ #include #include +#include void symlink_status(benchmark::State& state) { const auto path = std::filesystem::temp_directory_path(); From b41417ecf2c62b051dbae2a5b1d64ffa668d5e47 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Mon, 11 Nov 2024 07:56:05 -0800 Subject: [PATCH 8/8] Add `benchmark::DoNotOptimize(path)`. --- benchmarks/src/filesystem.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/benchmarks/src/filesystem.cpp b/benchmarks/src/filesystem.cpp index 0066c796754..33c8e69e875 100644 --- a/benchmarks/src/filesystem.cpp +++ b/benchmarks/src/filesystem.cpp @@ -10,6 +10,7 @@ void symlink_status(benchmark::State& state) { for (auto _ : state) { std::error_code ec; + benchmark::DoNotOptimize(path); const auto status = std::filesystem::symlink_status(path, ec); benchmark::DoNotOptimize(status); benchmark::DoNotOptimize(ec);