Improve performance of constructing filesystem::path from strings.
This patch fixes a performance bug when constructing or appending to a path from a string or c-string. Previously we called 'push_back' to append every single character. This caused multiple re-allocation and copies when at most one reallocation is necessary. The new behavior is to simply call `string::append` so it can correctly handle reallocation. For large strings this change is a ~4x improvement. This also makes our path faster to construct than libstdc++'s. git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@285530 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -21,10 +21,26 @@ void BM_PathConstructString(benchmark::State &st, GenInputs gen) {
|
||||
benchmark::DoNotOptimize(P.native().data());
|
||||
}
|
||||
}
|
||||
BENCHMARK_CAPTURE(BM_PathConstructString, iterate_elements,
|
||||
BENCHMARK_CAPTURE(BM_PathConstructString, large_string,
|
||||
getRandomStringInputs)->Arg(TestNumInputs);
|
||||
|
||||
|
||||
template <class GenInputs>
|
||||
void BM_PathConstructCStr(benchmark::State &st, GenInputs gen) {
|
||||
using namespace fs;
|
||||
const auto in = gen(st.range(0));
|
||||
path PP;
|
||||
for (auto& Part : in)
|
||||
PP /= Part;
|
||||
benchmark::DoNotOptimize(PP.native().data());
|
||||
while (st.KeepRunning()) {
|
||||
const path P(PP.native().c_str());
|
||||
benchmark::DoNotOptimize(P.native().data());
|
||||
}
|
||||
}
|
||||
BENCHMARK_CAPTURE(BM_PathConstructCStr, large_string,
|
||||
getRandomStringInputs)->Arg(TestNumInputs);
|
||||
|
||||
template <class GenInputs>
|
||||
void BM_PathIterateMultipleTimes(benchmark::State &st, GenInputs gen) {
|
||||
using namespace fs;
|
||||
@@ -85,6 +101,4 @@ void BM_PathIterateOnceBackwards(benchmark::State &st, GenInputs gen) {
|
||||
BENCHMARK_CAPTURE(BM_PathIterateOnceBackwards, iterate_elements,
|
||||
getRandomStringInputs)->Arg(TestNumInputs);
|
||||
|
||||
|
||||
|
||||
BENCHMARK_MAIN()
|
||||
|
||||
Reference in New Issue
Block a user