summaryrefslogtreecommitdiffstats
path: root/libcxx/benchmarks
Commit message (Collapse)AuthorAgeFilesLines
* Optimize filesystem::path by providing weaker exception guarantees.Eric Fiselier2016-10-312-0/+35
| | | | | | | | | | | | | | path uses string::append to construct, append, and concatenate paths. Unfortunatly string::append has a strong exception safety guaranteed and if it can't prove that the iterator operations don't throw then it will allocate a temporary string copy to append to. However this extra allocation and copy is very undesirable for path which doesn't have the same exception guarantees. To work around this this patch adds string::__append_forward_unsafe which exposes the std::string::append interface for forward iterators without enforcing that the iterator is noexcept. llvm-svn: 285532
* Improve performance of constructing filesystem::path from strings.Eric Fiselier2016-10-301-3/+17
| | | | | | | | | | | | | 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. llvm-svn: 285530
* Rewrite std::filesystem::path iterators and parserEric Fiselier2016-10-301-1/+2
| | | | | | | | | | | | | | | | | | | | | | This patch entirely rewrites the parsing logic for paths. Unlike the previous implementation this one stores information about the current state; For example if we are in a trailing separator or a root separator. This avoids the need for extra lookahead (and extra work) when incrementing or decrementing an iterator. Roughly this gives us a 15% speedup over the previous implementation. Unfortunately this implementation is still a lot slower than libstdc++'s. Because libstdc++ pre-parses and splits the path upon construction their iterators are trivial to increment/decrement. This makes libc++ lazy parsing 100x slower than libstdc++. However the pre-parsing libstdc++ causes a ton of extra and unneeded allocations when constructing the string. For example `path("/foo/bar/")` would require at least 5 allocations with libstdc++ whereas libc++ uses only one. The non-allocating behavior is much preferable when you consider filesystem usages like 'exists("/foo/bar/")'. Even then libc++'s path seems to be twice as slow to simply construct compared to libstdc++. More investigation is needed about this. llvm-svn: 285526
* Add start of filesystem benchmarksEric Fiselier2016-10-303-4/+118
| | | | llvm-svn: 285524
* remove warnings from google-benchmarks in libcxxSebastian Pop2016-10-142-2/+3
| | | | | | | | Differential Revision: https://reviews.llvm.org/D25522 Patch written by Aditya Kumar. llvm-svn: 284179
* Cleanup CMake status outputEric Fiselier2016-10-101-1/+5
| | | | llvm-svn: 283721
* Improve CMake output when registering benchmarksEric Fiselier2016-09-071-1/+1
| | | | llvm-svn: 280771
* Turn On -DLIBCXX_ENABLE_BENCHMARKS by default.Eric Fiselier2016-08-291-19/+16
| | | | | | | | | | | | | | This patch enables the `cxx-benchmarks` target by default. Note that the target still has to be manually invoked since it isn't included in the default 'make' rule. This patch also gets the benchmarks building w/ GCC. The build previously required the '-stdlib=libc++' flag but upstream patches to Google Benchmark now allow the library to build w/ libc++ and GCC. These changes should make the benchmarks easier to build and test. llvm-svn: 279999
* Update in-tree Google Benchmark to current ToT.Eric Fiselier2016-08-094-10/+15
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | I've put some work into the Google Benchmark library in order to make it easier to benchmark libc++. These changes have already been upstreamed into Google Benchmark and this patch applies the changes to the in-tree version. The main improvement in the addition of a 'compare_bench.py' script which makes it very easy to compare benchmarks. For example to compare the native STL to libc++ you would run: `$ compare_bench.py ./util_smartptr.native.out ./util_smartptr.libcxx.out` And the output would look like: RUNNING: ./util_smartptr.native.out Benchmark Time CPU Iterations ---------------------------------------------------------------- BM_SharedPtrCreateDestroy 62 ns 62 ns 10937500 BM_SharedPtrIncDecRef 31 ns 31 ns 23972603 BM_WeakPtrIncDecRef 28 ns 28 ns 23648649 RUNNING: ./util_smartptr.libcxx.out Benchmark Time CPU Iterations ---------------------------------------------------------------- BM_SharedPtrCreateDestroy 46 ns 46 ns 14957265 BM_SharedPtrIncDecRef 31 ns 31 ns 22435897 BM_WeakPtrIncDecRef 34 ns 34 ns 21084337 Comparing ./util_smartptr.native.out to ./util_smartptr.libcxx.out Benchmark Time CPU ----------------------------------------------------- BM_SharedPtrCreateDestroy -0.26 -0.26 BM_SharedPtrIncDecRef +0.00 +0.00 BM_WeakPtrIncDecRef +0.21 +0.21 llvm-svn: 278147
* Pass compilers when configuring Google Benchmark.Eric Fiselier2016-08-021-2/+7
| | | | llvm-svn: 277512
* Adding smart_ptr benchmarkBen Craig2016-08-011-0/+42
| | | | | | | | | Initial draft here: https://reviews.llvm.org/D22470 ... though this is Eric Fiselier's rewrite to fit in with Google Benchmark. llvm-svn: 277373
* Start adding benchmarks for vectorEric Fiselier2016-07-242-1/+44
| | | | llvm-svn: 276552
* Skip chash computation in insert/emplace if the unconstrained hash matches.Eric Fiselier2016-07-243-0/+77
| | | | llvm-svn: 276549
* [libcxx] Add support for benchmark tests using Google Benchmark.Eric Fiselier2016-07-195-27/+634
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Summary: This patch does the following: 1. Checks in a copy of the Google Benchmark library into the libc++ repo under `utils/google-benchmark`. 2. Teaches libc++ how to build Google Benchmark against both (A) in-tree libc++ and (B) the platforms native STL. 3. Allows performance benchmarks to be built as part of the libc++ build. Building the benchmarks (and Google Benchmark) is off by default. It must be enabled using the CMake option `-DLIBCXX_INCLUDE_BENCHMARKS=ON`. When this option is enabled the tests under `libcxx/benchmarks` can be built using the `libcxx-benchmarks` target. On Linux platforms where libstdc++ is the default STL the CMake option `-DLIBCXX_BUILD_BENCHMARKS_NATIVE_STDLIB=ON` can be used to build each benchmark test against libstdc++ as well. This is useful for comparing performance between standard libraries. Support for benchmarks is currently very minimal. They must be manually run by the user and there is no mechanism for detecting performance regressions. Known Issues: * `-DLIBCXX_INCLUDE_BENCHMARKS=ON` is only supported for Clang, and not GCC, since the `-stdlib=libc++` option is needed to build Google Benchmark. Reviewers: danalbert, dberlin, chandlerc, mclow.lists, jroelofs Subscribers: chandlerc, dberlin, tberghammer, danalbert, srhines, hfinkel Differential Revision: https://reviews.llvm.org/D22240 llvm-svn: 276049
* Add unordered_map::insert benchmark test and rename fileEric Fiselier2016-07-022-29/+44
| | | | llvm-svn: 274424
* Improve performance of unordered_set<uint32_t>::find by 45%. Add benchmarks.Eric Fiselier2016-07-021-0/+29
This patch improves the performance of unordered_set's find by 45% when the value exists within the set. __hash_tables find method needs to check if it's reached the end of the bucket by constraining the hash of the current node and checking it against the bucket index. However constraining the hash is an expensive operations and it can be avoided if the two unconstrained hashes are equal. This patch applies that optimization. This patch also adds a top level directory called benchmarks. 'benchmarks/' is intended to store any/all benchmarks written for the standard library. Currently nothing is done with files under 'benchmarks/' but I would like to move towards introducing a formal format and test runner. llvm-svn: 274423
OpenPOWER on IntegriCloud