[libcxx] Add support for benchmark tests using Google Benchmark.
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
2016-07-20 07:07:03 +08:00
|
|
|
#ifndef BENCHMARK_GENERATE_INPUT_HPP
|
|
|
|
#define BENCHMARK_GENERATE_INPUT_HPP
|
|
|
|
|
|
|
|
#include <algorithm>
|
|
|
|
#include <random>
|
|
|
|
#include <vector>
|
|
|
|
#include <string>
|
|
|
|
#include <climits>
|
|
|
|
#include <cstddef>
|
|
|
|
|
|
|
|
static const char Letters[] = {
|
|
|
|
'0','1','2','3','4',
|
|
|
|
'5','6','7','8','9',
|
|
|
|
'A','B','C','D','E','F',
|
|
|
|
'G','H','I','J','K',
|
|
|
|
'L','M','N','O','P',
|
|
|
|
'Q','R','S','T','U',
|
|
|
|
'V','W','X','Y','Z',
|
|
|
|
'a','b','c','d','e','f',
|
|
|
|
'g','h','i','j','k',
|
|
|
|
'l','m','n','o','p',
|
|
|
|
'q','r','s','t','u',
|
|
|
|
'v','w','x','y','z'
|
|
|
|
};
|
|
|
|
static const std::size_t LettersSize = sizeof(Letters);
|
|
|
|
|
|
|
|
inline std::default_random_engine& getRandomEngine() {
|
|
|
|
static std::default_random_engine RandEngine(std::random_device{}());
|
|
|
|
return RandEngine;
|
|
|
|
}
|
|
|
|
|
2018-04-03 07:03:41 +08:00
|
|
|
|
[libcxx] Add support for benchmark tests using Google Benchmark.
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
2016-07-20 07:07:03 +08:00
|
|
|
inline char getRandomChar() {
|
|
|
|
std::uniform_int_distribution<> LettersDist(0, LettersSize-1);
|
|
|
|
return Letters[LettersDist(getRandomEngine())];
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class IntT>
|
2018-04-03 07:03:41 +08:00
|
|
|
inline IntT getRandomInteger(IntT Min = 0,
|
|
|
|
IntT Max = std::numeric_limits<IntT>::max()) {
|
|
|
|
std::uniform_int_distribution<IntT> dist(Min, Max);
|
[libcxx] Add support for benchmark tests using Google Benchmark.
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
2016-07-20 07:07:03 +08:00
|
|
|
return dist(getRandomEngine());
|
|
|
|
}
|
|
|
|
|
|
|
|
inline std::string getRandomString(std::size_t Len) {
|
|
|
|
std::string str(Len, 0);
|
|
|
|
std::generate_n(str.begin(), Len, &getRandomChar);
|
|
|
|
return str;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class IntT>
|
|
|
|
inline std::vector<IntT> getDuplicateIntegerInputs(size_t N) {
|
|
|
|
std::vector<IntT> inputs(N, static_cast<IntT>(-1));
|
|
|
|
return inputs;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class IntT>
|
|
|
|
inline std::vector<IntT> getSortedIntegerInputs(size_t N) {
|
|
|
|
std::vector<IntT> inputs;
|
|
|
|
for (size_t i=0; i < N; i += 1)
|
|
|
|
inputs.push_back(i);
|
|
|
|
return inputs;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class IntT>
|
|
|
|
std::vector<IntT> getSortedLargeIntegerInputs(size_t N) {
|
|
|
|
std::vector<IntT> inputs;
|
|
|
|
for (size_t i=0; i < N; ++i) {
|
|
|
|
inputs.push_back(i + N);
|
|
|
|
}
|
|
|
|
return inputs;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class IntT>
|
|
|
|
std::vector<IntT> getSortedTopBitsIntegerInputs(size_t N) {
|
|
|
|
std::vector<IntT> inputs = getSortedIntegerInputs<IntT>(N);
|
|
|
|
for (auto& E : inputs) E <<= ((sizeof(IntT) / 2) * CHAR_BIT);
|
|
|
|
return inputs;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class IntT>
|
|
|
|
inline std::vector<IntT> getReverseSortedIntegerInputs(size_t N) {
|
|
|
|
std::vector<IntT> inputs;
|
|
|
|
std::size_t i = N;
|
|
|
|
while (i > 0) {
|
|
|
|
--i;
|
|
|
|
inputs.push_back(i);
|
|
|
|
}
|
|
|
|
return inputs;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class IntT>
|
|
|
|
std::vector<IntT> getPipeOrganIntegerInputs(size_t N) {
|
|
|
|
std::vector<IntT> v; v.reserve(N);
|
|
|
|
for (size_t i = 0; i < N/2; ++i) v.push_back(i);
|
|
|
|
for (size_t i = N/2; i < N; ++i) v.push_back(N - i);
|
|
|
|
return v;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
template <class IntT>
|
|
|
|
std::vector<IntT> getRandomIntegerInputs(size_t N) {
|
|
|
|
std::vector<IntT> inputs;
|
|
|
|
for (size_t i=0; i < N; ++i) {
|
|
|
|
inputs.push_back(getRandomInteger<IntT>());
|
|
|
|
}
|
|
|
|
return inputs;
|
|
|
|
}
|
|
|
|
|
|
|
|
inline std::vector<std::string> getDuplicateStringInputs(size_t N) {
|
|
|
|
std::vector<std::string> inputs(N, getRandomString(1024));
|
|
|
|
return inputs;
|
|
|
|
}
|
|
|
|
|
|
|
|
inline std::vector<std::string> getRandomStringInputs(size_t N) {
|
|
|
|
std::vector<std::string> inputs;
|
2016-10-14 08:07:57 +08:00
|
|
|
for (size_t i=0; i < N; ++i) {
|
[libcxx] Add support for benchmark tests using Google Benchmark.
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
2016-07-20 07:07:03 +08:00
|
|
|
inputs.push_back(getRandomString(1024));
|
|
|
|
}
|
|
|
|
return inputs;
|
|
|
|
}
|
|
|
|
|
|
|
|
inline std::vector<std::string> getSortedStringInputs(size_t N) {
|
|
|
|
std::vector<std::string> inputs = getRandomStringInputs(N);
|
|
|
|
std::sort(inputs.begin(), inputs.end());
|
|
|
|
return inputs;
|
|
|
|
}
|
|
|
|
|
|
|
|
inline std::vector<std::string> getReverseSortedStringInputs(size_t N) {
|
|
|
|
std::vector<std::string> inputs = getSortedStringInputs(N);
|
|
|
|
std::reverse(inputs.begin(), inputs.end());
|
|
|
|
return inputs;
|
|
|
|
}
|
|
|
|
|
2016-07-24 14:22:25 +08:00
|
|
|
inline std::vector<const char*> getRandomCStringInputs(size_t N) {
|
|
|
|
static std::vector<std::string> inputs = getRandomStringInputs(N);
|
|
|
|
std::vector<const char*> cinputs;
|
|
|
|
for (auto const& str : inputs)
|
|
|
|
cinputs.push_back(str.c_str());
|
|
|
|
return cinputs;
|
|
|
|
}
|
2016-10-31 06:53:00 +08:00
|
|
|
|
|
|
|
|
[libcxx] Add support for benchmark tests using Google Benchmark.
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
2016-07-20 07:07:03 +08:00
|
|
|
#endif // BENCHMARK_GENERATE_INPUT_HPP
|