mirror of
https://github.com/google/benchmark.git
synced 2025-03-28 21:10:58 +08:00
remove cxx03 test, fully unblocking c++1X development (#1903)
* remove cxx03 test, fully unblocking c++1X development * remove unnecessary macros * pre-commit * remove opt-in analyzer warnings from clang-tidy * revert some changes, flush streams * replace abort with exit(1) to call atexit and dtors * remove more endl and put in explicit flush
This commit is contained in:
parent
933e6d3c1f
commit
835365f99a
.github/workflows
include/benchmark
src
test
2
.github/workflows/clang-tidy.yml
vendored
2
.github/workflows/clang-tidy.yml
vendored
@ -35,4 +35,4 @@ jobs:
|
||||
- name: run
|
||||
shell: bash
|
||||
working-directory: ${{ runner.workspace }}/_build
|
||||
run: run-clang-tidy -checks=*,-clang-analyzer-deadcode*
|
||||
run: run-clang-tidy -checks=*,-clang-analyzer-deadcode*,-clang-analyzer-optin*
|
||||
|
@ -163,60 +163,31 @@ BENCHMARK(BM_test)->Unit(benchmark::kMillisecond);
|
||||
#ifndef BENCHMARK_BENCHMARK_H_
|
||||
#define BENCHMARK_BENCHMARK_H_
|
||||
|
||||
// The _MSVC_LANG check should detect Visual Studio 2015 Update 3 and newer.
|
||||
#if __cplusplus >= 201103L || (defined(_MSVC_LANG) && _MSVC_LANG >= 201103L)
|
||||
#define BENCHMARK_HAS_CXX11
|
||||
#endif
|
||||
|
||||
// This _MSC_VER check should detect VS 2017 v15.3 and newer.
|
||||
#if __cplusplus >= 201703L || \
|
||||
(defined(_MSC_VER) && _MSC_VER >= 1911 && _MSVC_LANG >= 201703L)
|
||||
#define BENCHMARK_HAS_CXX17
|
||||
#endif
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include <algorithm>
|
||||
#include <atomic>
|
||||
#include <cassert>
|
||||
#include <cstddef>
|
||||
#include <initializer_list>
|
||||
#include <iosfwd>
|
||||
#include <limits>
|
||||
#include <map>
|
||||
#include <set>
|
||||
#include <string>
|
||||
#include <type_traits>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
#include "benchmark/export.h"
|
||||
|
||||
#if defined(BENCHMARK_HAS_CXX11)
|
||||
#include <atomic>
|
||||
#include <initializer_list>
|
||||
#include <type_traits>
|
||||
#include <utility>
|
||||
#endif
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
#include <intrin.h> // for _ReadWriteBarrier
|
||||
#endif
|
||||
|
||||
#ifndef BENCHMARK_HAS_CXX11
|
||||
#define BENCHMARK_DISALLOW_COPY_AND_ASSIGN(TypeName) \
|
||||
TypeName(const TypeName&); \
|
||||
TypeName& operator=(const TypeName&)
|
||||
#else
|
||||
#define BENCHMARK_DISALLOW_COPY_AND_ASSIGN(TypeName) \
|
||||
TypeName(const TypeName&) = delete; \
|
||||
TypeName& operator=(const TypeName&) = delete
|
||||
#endif
|
||||
|
||||
#ifdef BENCHMARK_HAS_CXX17
|
||||
#define BENCHMARK_UNUSED [[maybe_unused]]
|
||||
#elif defined(__GNUC__) || defined(__clang__)
|
||||
#define BENCHMARK_UNUSED __attribute__((unused))
|
||||
#else
|
||||
#define BENCHMARK_UNUSED
|
||||
#endif
|
||||
|
||||
// Used to annotate functions, methods and classes so they
|
||||
// are not optimized by the compiler. Useful for tests
|
||||
@ -284,12 +255,6 @@ BENCHMARK(BM_test)->Unit(benchmark::kMillisecond);
|
||||
#define BENCHMARK_UNREACHABLE() ((void)0)
|
||||
#endif
|
||||
|
||||
#ifdef BENCHMARK_HAS_CXX11
|
||||
#define BENCHMARK_OVERRIDE override
|
||||
#else
|
||||
#define BENCHMARK_OVERRIDE
|
||||
#endif
|
||||
|
||||
#if defined(__GNUC__)
|
||||
// Determine the cacheline size based on architecture
|
||||
#if defined(__i386__) || defined(__x86_64__)
|
||||
@ -495,7 +460,7 @@ BENCHMARK_EXPORT Benchmark* RegisterBenchmarkInternal(Benchmark*);
|
||||
|
||||
// Ensure that the standard streams are properly initialized in every TU.
|
||||
BENCHMARK_EXPORT int InitializeStreams();
|
||||
BENCHMARK_UNUSED static int stream_init_anchor = InitializeStreams();
|
||||
[[maybe_unused]] static int stream_init_anchor = InitializeStreams();
|
||||
|
||||
} // namespace internal
|
||||
|
||||
@ -506,11 +471,9 @@ BENCHMARK_UNUSED static int stream_init_anchor = InitializeStreams();
|
||||
|
||||
// Force the compiler to flush pending writes to global memory. Acts as an
|
||||
// effective read/write barrier
|
||||
#ifdef BENCHMARK_HAS_CXX11
|
||||
inline BENCHMARK_ALWAYS_INLINE void ClobberMemory() {
|
||||
std::atomic_signal_fence(std::memory_order_acq_rel);
|
||||
}
|
||||
#endif
|
||||
|
||||
// The DoNotOptimize(...) function can be used to prevent a value or
|
||||
// expression from being optimized away by the compiler. This function is
|
||||
@ -535,7 +498,6 @@ inline BENCHMARK_ALWAYS_INLINE void DoNotOptimize(Tp& value) {
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef BENCHMARK_HAS_CXX11
|
||||
template <class Tp>
|
||||
inline BENCHMARK_ALWAYS_INLINE void DoNotOptimize(Tp&& value) {
|
||||
#if defined(__clang__)
|
||||
@ -544,8 +506,8 @@ inline BENCHMARK_ALWAYS_INLINE void DoNotOptimize(Tp&& value) {
|
||||
asm volatile("" : "+m,r"(value) : : "memory");
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
#elif defined(BENCHMARK_HAS_CXX11) && (__GNUC__ >= 5)
|
||||
// !defined(__GNUC__) || defined(__llvm__) || defined(__INTEL_COMPILER)
|
||||
#elif (__GNUC__ >= 5)
|
||||
// Workaround for a bug with full argument copy overhead with GCC.
|
||||
// See: #1340 and https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105519
|
||||
template <class Tp>
|
||||
@ -601,37 +563,9 @@ inline BENCHMARK_ALWAYS_INLINE
|
||||
DoNotOptimize(Tp&& value) {
|
||||
asm volatile("" : "+m"(value) : : "memory");
|
||||
}
|
||||
|
||||
#else
|
||||
// Fallback for GCC < 5. Can add some overhead because the compiler is forced
|
||||
// to use memory operations instead of operations with registers.
|
||||
// TODO: Remove if GCC < 5 will be unsupported.
|
||||
template <class Tp>
|
||||
BENCHMARK_DEPRECATED_MSG(
|
||||
"The const-ref version of this method can permit "
|
||||
"undesired compiler optimizations in benchmarks")
|
||||
inline BENCHMARK_ALWAYS_INLINE void DoNotOptimize(Tp const& value) {
|
||||
asm volatile("" : : "m"(value) : "memory");
|
||||
}
|
||||
|
||||
template <class Tp>
|
||||
inline BENCHMARK_ALWAYS_INLINE void DoNotOptimize(Tp& value) {
|
||||
asm volatile("" : "+m"(value) : : "memory");
|
||||
}
|
||||
|
||||
#ifdef BENCHMARK_HAS_CXX11
|
||||
template <class Tp>
|
||||
inline BENCHMARK_ALWAYS_INLINE void DoNotOptimize(Tp&& value) {
|
||||
asm volatile("" : "+m"(value) : : "memory");
|
||||
}
|
||||
#endif
|
||||
// !defined(__GNUC__) || defined(__llvm__) || defined(__INTEL_COMPILER)
|
||||
#endif
|
||||
|
||||
#ifndef BENCHMARK_HAS_CXX11
|
||||
inline BENCHMARK_ALWAYS_INLINE void ClobberMemory() {
|
||||
asm volatile("" : : : "memory");
|
||||
}
|
||||
#endif
|
||||
#elif defined(_MSC_VER)
|
||||
template <class Tp>
|
||||
BENCHMARK_DEPRECATED_MSG(
|
||||
@ -642,29 +576,11 @@ inline BENCHMARK_ALWAYS_INLINE void DoNotOptimize(Tp const& value) {
|
||||
_ReadWriteBarrier();
|
||||
}
|
||||
|
||||
#ifndef BENCHMARK_HAS_CXX11
|
||||
inline BENCHMARK_ALWAYS_INLINE void ClobberMemory() { _ReadWriteBarrier(); }
|
||||
#endif
|
||||
#else
|
||||
#ifdef BENCHMARK_HAS_CXX11
|
||||
template <class Tp>
|
||||
inline BENCHMARK_ALWAYS_INLINE void DoNotOptimize(Tp&& value) {
|
||||
internal::UseCharPointer(&reinterpret_cast<char const volatile&>(value));
|
||||
}
|
||||
#else
|
||||
template <class Tp>
|
||||
BENCHMARK_DEPRECATED_MSG(
|
||||
"The const-ref version of this method can permit "
|
||||
"undesired compiler optimizations in benchmarks")
|
||||
inline BENCHMARK_ALWAYS_INLINE void DoNotOptimize(Tp const& value) {
|
||||
internal::UseCharPointer(&reinterpret_cast<char const volatile&>(value));
|
||||
}
|
||||
|
||||
template <class Tp>
|
||||
inline BENCHMARK_ALWAYS_INLINE void DoNotOptimize(Tp& value) {
|
||||
internal::UseCharPointer(&reinterpret_cast<char const volatile&>(value));
|
||||
}
|
||||
#endif
|
||||
// FIXME Add ClobberMemory() for non-gnu and non-msvc compilers, before C++11.
|
||||
#endif
|
||||
|
||||
@ -764,12 +680,7 @@ class ThreadTimer;
|
||||
class ThreadManager;
|
||||
class PerfCountersMeasurement;
|
||||
|
||||
enum AggregationReportMode
|
||||
#if defined(BENCHMARK_HAS_CXX11)
|
||||
: unsigned
|
||||
#else
|
||||
#endif
|
||||
{
|
||||
enum AggregationReportMode : unsigned {
|
||||
// The mode has not been manually specified
|
||||
ARM_Unspecified = 0,
|
||||
// The mode is user-specified.
|
||||
@ -784,11 +695,7 @@ enum AggregationReportMode
|
||||
ARM_FileReportAggregatesOnly | ARM_DisplayReportAggregatesOnly
|
||||
};
|
||||
|
||||
enum Skipped
|
||||
#if defined(BENCHMARK_HAS_CXX11)
|
||||
: unsigned
|
||||
#endif
|
||||
{
|
||||
enum Skipped : unsigned {
|
||||
NotSkipped = 0,
|
||||
SkippedWithMessage,
|
||||
SkippedWithError
|
||||
@ -1109,7 +1016,7 @@ inline BENCHMARK_ALWAYS_INLINE bool State::KeepRunningInternal(IterationCount n,
|
||||
}
|
||||
|
||||
struct State::StateIterator {
|
||||
struct BENCHMARK_UNUSED Value {};
|
||||
struct [[maybe_unused]] Value {};
|
||||
typedef std::forward_iterator_tag iterator_category;
|
||||
typedef Value value_type;
|
||||
typedef Value reference;
|
||||
@ -1404,17 +1311,7 @@ class BENCHMARK_EXPORT Benchmark {
|
||||
callback_function setup_;
|
||||
callback_function teardown_;
|
||||
|
||||
Benchmark(Benchmark const&)
|
||||
#if defined(BENCHMARK_HAS_CXX11)
|
||||
= delete
|
||||
#endif
|
||||
;
|
||||
|
||||
Benchmark& operator=(Benchmark const&)
|
||||
#if defined(BENCHMARK_HAS_CXX11)
|
||||
= delete
|
||||
#endif
|
||||
;
|
||||
BENCHMARK_DISALLOW_COPY_AND_ASSIGN(Benchmark);
|
||||
};
|
||||
|
||||
} // namespace internal
|
||||
@ -1426,10 +1323,8 @@ class BENCHMARK_EXPORT Benchmark {
|
||||
internal::Benchmark* RegisterBenchmark(const std::string& name,
|
||||
internal::Function* fn);
|
||||
|
||||
#if defined(BENCHMARK_HAS_CXX11)
|
||||
template <class Lambda>
|
||||
internal::Benchmark* RegisterBenchmark(const std::string& name, Lambda&& fn);
|
||||
#endif
|
||||
|
||||
// Remove all registered benchmarks. All pointers to previously registered
|
||||
// benchmarks are invalidated.
|
||||
@ -1443,17 +1338,16 @@ class BENCHMARK_EXPORT FunctionBenchmark : public Benchmark {
|
||||
FunctionBenchmark(const std::string& name, Function* func)
|
||||
: Benchmark(name), func_(func) {}
|
||||
|
||||
void Run(State& st) BENCHMARK_OVERRIDE;
|
||||
void Run(State& st) override;
|
||||
|
||||
private:
|
||||
Function* func_;
|
||||
};
|
||||
|
||||
#ifdef BENCHMARK_HAS_CXX11
|
||||
template <class Lambda>
|
||||
class LambdaBenchmark : public Benchmark {
|
||||
public:
|
||||
void Run(State& st) BENCHMARK_OVERRIDE { lambda_(st); }
|
||||
void Run(State& st) override { lambda_(st); }
|
||||
|
||||
private:
|
||||
template <class OLambda>
|
||||
@ -1467,7 +1361,6 @@ class LambdaBenchmark : public Benchmark {
|
||||
|
||||
Lambda lambda_;
|
||||
};
|
||||
#endif
|
||||
} // namespace internal
|
||||
|
||||
inline internal::Benchmark* RegisterBenchmark(const std::string& name,
|
||||
@ -1478,7 +1371,6 @@ inline internal::Benchmark* RegisterBenchmark(const std::string& name,
|
||||
::new internal::FunctionBenchmark(name, fn));
|
||||
}
|
||||
|
||||
#ifdef BENCHMARK_HAS_CXX11
|
||||
template <class Lambda>
|
||||
internal::Benchmark* RegisterBenchmark(const std::string& name, Lambda&& fn) {
|
||||
using BenchType =
|
||||
@ -1488,10 +1380,8 @@ internal::Benchmark* RegisterBenchmark(const std::string& name, Lambda&& fn) {
|
||||
return internal::RegisterBenchmarkInternal(
|
||||
::new BenchType(name, std::forward<Lambda>(fn)));
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(BENCHMARK_HAS_CXX11) && \
|
||||
(!defined(BENCHMARK_GCC_VERSION) || BENCHMARK_GCC_VERSION >= 409)
|
||||
#if (!defined(BENCHMARK_GCC_VERSION) || BENCHMARK_GCC_VERSION >= 409)
|
||||
template <class Lambda, class... Args>
|
||||
internal::Benchmark* RegisterBenchmark(const std::string& name, Lambda&& fn,
|
||||
Args&&... args) {
|
||||
@ -1507,7 +1397,7 @@ class Fixture : public internal::Benchmark {
|
||||
public:
|
||||
Fixture() : internal::Benchmark("") {}
|
||||
|
||||
void Run(State& st) BENCHMARK_OVERRIDE {
|
||||
void Run(State& st) override {
|
||||
this->SetUp(st);
|
||||
this->BenchmarkCase(st);
|
||||
this->TearDown(st);
|
||||
@ -1538,14 +1428,9 @@ class Fixture : public internal::Benchmark {
|
||||
#endif
|
||||
|
||||
// Helpers for generating unique variable names
|
||||
#ifdef BENCHMARK_HAS_CXX11
|
||||
#define BENCHMARK_PRIVATE_NAME(...) \
|
||||
BENCHMARK_PRIVATE_CONCAT(benchmark_uniq_, BENCHMARK_PRIVATE_UNIQUE_ID, \
|
||||
__VA_ARGS__)
|
||||
#else
|
||||
#define BENCHMARK_PRIVATE_NAME(n) \
|
||||
BENCHMARK_PRIVATE_CONCAT(benchmark_uniq_, BENCHMARK_PRIVATE_UNIQUE_ID, n)
|
||||
#endif // BENCHMARK_HAS_CXX11
|
||||
|
||||
#define BENCHMARK_PRIVATE_CONCAT(a, b, c) BENCHMARK_PRIVATE_CONCAT2(a, b, c)
|
||||
#define BENCHMARK_PRIVATE_CONCAT2(a, b, c) a##b##c
|
||||
@ -1556,20 +1441,13 @@ class Fixture : public internal::Benchmark {
|
||||
#define BENCHMARK_PRIVATE_DECLARE(n) \
|
||||
/* NOLINTNEXTLINE(misc-use-anonymous-namespace) */ \
|
||||
static ::benchmark::internal::Benchmark* BENCHMARK_PRIVATE_NAME(n) \
|
||||
BENCHMARK_UNUSED
|
||||
[[maybe_unused]]
|
||||
|
||||
#ifdef BENCHMARK_HAS_CXX11
|
||||
#define BENCHMARK(...) \
|
||||
BENCHMARK_PRIVATE_DECLARE(_benchmark_) = \
|
||||
(::benchmark::internal::RegisterBenchmarkInternal( \
|
||||
new ::benchmark::internal::FunctionBenchmark(#__VA_ARGS__, \
|
||||
__VA_ARGS__)))
|
||||
#else
|
||||
#define BENCHMARK(n) \
|
||||
BENCHMARK_PRIVATE_DECLARE(n) = \
|
||||
(::benchmark::internal::RegisterBenchmarkInternal( \
|
||||
new ::benchmark::internal::FunctionBenchmark(#n, n)))
|
||||
#endif // BENCHMARK_HAS_CXX11
|
||||
|
||||
// Old-style macros
|
||||
#define BENCHMARK_WITH_ARG(n, a) BENCHMARK(n)->Arg((a))
|
||||
@ -1579,8 +1457,6 @@ class Fixture : public internal::Benchmark {
|
||||
#define BENCHMARK_RANGE2(n, l1, h1, l2, h2) \
|
||||
BENCHMARK(n)->RangePair({{(l1), (h1)}, {(l2), (h2)}})
|
||||
|
||||
#ifdef BENCHMARK_HAS_CXX11
|
||||
|
||||
// Register a benchmark which invokes the function specified by `func`
|
||||
// with the additional arguments specified by `...`.
|
||||
//
|
||||
@ -1599,8 +1475,6 @@ class Fixture : public internal::Benchmark {
|
||||
#func "/" #test_case_name, \
|
||||
[](::benchmark::State& st) { func(st, __VA_ARGS__); })))
|
||||
|
||||
#endif // BENCHMARK_HAS_CXX11
|
||||
|
||||
// This will register a benchmark for a templatized function. For example:
|
||||
//
|
||||
// template<int arg>
|
||||
@ -1620,17 +1494,12 @@ class Fixture : public internal::Benchmark {
|
||||
new ::benchmark::internal::FunctionBenchmark(#n "<" #a "," #b ">", \
|
||||
n<a, b>)))
|
||||
|
||||
#ifdef BENCHMARK_HAS_CXX11
|
||||
#define BENCHMARK_TEMPLATE(n, ...) \
|
||||
BENCHMARK_PRIVATE_DECLARE(n) = \
|
||||
(::benchmark::internal::RegisterBenchmarkInternal( \
|
||||
new ::benchmark::internal::FunctionBenchmark( \
|
||||
#n "<" #__VA_ARGS__ ">", n<__VA_ARGS__>)))
|
||||
#else
|
||||
#define BENCHMARK_TEMPLATE(n, a) BENCHMARK_TEMPLATE1(n, a)
|
||||
#endif
|
||||
|
||||
#ifdef BENCHMARK_HAS_CXX11
|
||||
// This will register a benchmark for a templatized function,
|
||||
// with the additional arguments specified by `...`.
|
||||
//
|
||||
@ -1653,17 +1522,16 @@ class Fixture : public internal::Benchmark {
|
||||
#func "<" #a "," #b ">" \
|
||||
"/" #test_case_name, \
|
||||
[](::benchmark::State& st) { func<a, b>(st, __VA_ARGS__); })))
|
||||
#endif // BENCHMARK_HAS_CXX11
|
||||
|
||||
#define BENCHMARK_PRIVATE_DECLARE_F(BaseClass, Method) \
|
||||
class BaseClass##_##Method##_Benchmark : public BaseClass { \
|
||||
public: \
|
||||
BaseClass##_##Method##_Benchmark() { \
|
||||
this->SetName(#BaseClass "/" #Method); \
|
||||
} \
|
||||
\
|
||||
protected: \
|
||||
void BenchmarkCase(::benchmark::State&) BENCHMARK_OVERRIDE; \
|
||||
#define BENCHMARK_PRIVATE_DECLARE_F(BaseClass, Method) \
|
||||
class BaseClass##_##Method##_Benchmark : public BaseClass { \
|
||||
public: \
|
||||
BaseClass##_##Method##_Benchmark() { \
|
||||
this->SetName(#BaseClass "/" #Method); \
|
||||
} \
|
||||
\
|
||||
protected: \
|
||||
void BenchmarkCase(::benchmark::State&) override; \
|
||||
};
|
||||
|
||||
#define BENCHMARK_TEMPLATE1_PRIVATE_DECLARE_F(BaseClass, Method, a) \
|
||||
@ -1674,7 +1542,7 @@ class Fixture : public internal::Benchmark {
|
||||
} \
|
||||
\
|
||||
protected: \
|
||||
void BenchmarkCase(::benchmark::State&) BENCHMARK_OVERRIDE; \
|
||||
void BenchmarkCase(::benchmark::State&) override; \
|
||||
};
|
||||
|
||||
#define BENCHMARK_TEMPLATE2_PRIVATE_DECLARE_F(BaseClass, Method, a, b) \
|
||||
@ -1685,10 +1553,9 @@ class Fixture : public internal::Benchmark {
|
||||
} \
|
||||
\
|
||||
protected: \
|
||||
void BenchmarkCase(::benchmark::State&) BENCHMARK_OVERRIDE; \
|
||||
void BenchmarkCase(::benchmark::State&) override; \
|
||||
};
|
||||
|
||||
#ifdef BENCHMARK_HAS_CXX11
|
||||
#define BENCHMARK_TEMPLATE_PRIVATE_DECLARE_F(BaseClass, Method, ...) \
|
||||
class BaseClass##_##Method##_Benchmark : public BaseClass<__VA_ARGS__> { \
|
||||
public: \
|
||||
@ -1697,12 +1564,8 @@ class Fixture : public internal::Benchmark {
|
||||
} \
|
||||
\
|
||||
protected: \
|
||||
void BenchmarkCase(::benchmark::State&) BENCHMARK_OVERRIDE; \
|
||||
void BenchmarkCase(::benchmark::State&) override; \
|
||||
};
|
||||
#else
|
||||
#define BENCHMARK_TEMPLATE_PRIVATE_DECLARE_F(n, a) \
|
||||
BENCHMARK_TEMPLATE1_PRIVATE_DECLARE_F(n, a)
|
||||
#endif
|
||||
|
||||
#define BENCHMARK_DEFINE_F(BaseClass, Method) \
|
||||
BENCHMARK_PRIVATE_DECLARE_F(BaseClass, Method) \
|
||||
@ -1716,14 +1579,9 @@ class Fixture : public internal::Benchmark {
|
||||
BENCHMARK_TEMPLATE2_PRIVATE_DECLARE_F(BaseClass, Method, a, b) \
|
||||
void BENCHMARK_PRIVATE_CONCAT_NAME(BaseClass, Method)::BenchmarkCase
|
||||
|
||||
#ifdef BENCHMARK_HAS_CXX11
|
||||
#define BENCHMARK_TEMPLATE_DEFINE_F(BaseClass, Method, ...) \
|
||||
BENCHMARK_TEMPLATE_PRIVATE_DECLARE_F(BaseClass, Method, __VA_ARGS__) \
|
||||
void BENCHMARK_PRIVATE_CONCAT_NAME(BaseClass, Method)::BenchmarkCase
|
||||
#else
|
||||
#define BENCHMARK_TEMPLATE_DEFINE_F(BaseClass, Method, a) \
|
||||
BENCHMARK_TEMPLATE1_DEFINE_F(BaseClass, Method, a)
|
||||
#endif
|
||||
|
||||
#define BENCHMARK_REGISTER_F(BaseClass, Method) \
|
||||
BENCHMARK_PRIVATE_REGISTER_F(BENCHMARK_PRIVATE_CONCAT_NAME(BaseClass, Method))
|
||||
@ -1748,15 +1606,10 @@ class Fixture : public internal::Benchmark {
|
||||
BENCHMARK_REGISTER_F(BaseClass, Method); \
|
||||
void BENCHMARK_PRIVATE_CONCAT_NAME(BaseClass, Method)::BenchmarkCase
|
||||
|
||||
#ifdef BENCHMARK_HAS_CXX11
|
||||
#define BENCHMARK_TEMPLATE_F(BaseClass, Method, ...) \
|
||||
BENCHMARK_TEMPLATE_PRIVATE_DECLARE_F(BaseClass, Method, __VA_ARGS__) \
|
||||
BENCHMARK_REGISTER_F(BaseClass, Method); \
|
||||
void BENCHMARK_PRIVATE_CONCAT_NAME(BaseClass, Method)::BenchmarkCase
|
||||
#else
|
||||
#define BENCHMARK_TEMPLATE_F(BaseClass, Method, a) \
|
||||
BENCHMARK_TEMPLATE1_F(BaseClass, Method, a)
|
||||
#endif
|
||||
|
||||
// Helper macro to create a main routine in a test that runs the benchmarks
|
||||
// Note the workaround for Hexagon simulator passing argc != 0, argv = NULL.
|
||||
@ -2016,8 +1869,8 @@ class BENCHMARK_EXPORT ConsoleReporter : public BenchmarkReporter {
|
||||
explicit ConsoleReporter(OutputOptions opts_ = OO_Defaults)
|
||||
: output_options_(opts_), name_field_width_(0), printed_header_(false) {}
|
||||
|
||||
bool ReportContext(const Context& context) BENCHMARK_OVERRIDE;
|
||||
void ReportRuns(const std::vector<Run>& reports) BENCHMARK_OVERRIDE;
|
||||
bool ReportContext(const Context& context) override;
|
||||
void ReportRuns(const std::vector<Run>& reports) override;
|
||||
|
||||
protected:
|
||||
virtual void PrintRunData(const Run& report);
|
||||
@ -2032,9 +1885,9 @@ class BENCHMARK_EXPORT ConsoleReporter : public BenchmarkReporter {
|
||||
class BENCHMARK_EXPORT JSONReporter : public BenchmarkReporter {
|
||||
public:
|
||||
JSONReporter() : first_report_(true) {}
|
||||
bool ReportContext(const Context& context) BENCHMARK_OVERRIDE;
|
||||
void ReportRuns(const std::vector<Run>& reports) BENCHMARK_OVERRIDE;
|
||||
void Finalize() BENCHMARK_OVERRIDE;
|
||||
bool ReportContext(const Context& context) override;
|
||||
void ReportRuns(const std::vector<Run>& reports) override;
|
||||
void Finalize() override;
|
||||
|
||||
private:
|
||||
void PrintRunData(const Run& report);
|
||||
@ -2047,8 +1900,8 @@ class BENCHMARK_EXPORT BENCHMARK_DEPRECATED_MSG(
|
||||
: public BenchmarkReporter {
|
||||
public:
|
||||
CSVReporter() : printed_header_(false) {}
|
||||
bool ReportContext(const Context& context) BENCHMARK_OVERRIDE;
|
||||
void ReportRuns(const std::vector<Run>& reports) BENCHMARK_OVERRIDE;
|
||||
bool ReportContext(const Context& context) override;
|
||||
void ReportRuns(const std::vector<Run>& reports) override;
|
||||
|
||||
private:
|
||||
void PrintRunData(const Run& report);
|
||||
|
@ -506,6 +506,7 @@ std::unique_ptr<BenchmarkReporter> CreateReporter(
|
||||
return PtrType(new CSVReporter());
|
||||
}
|
||||
std::cerr << "Unexpected format: '" << name << "'\n";
|
||||
std::flush(std::cerr);
|
||||
std::exit(1);
|
||||
}
|
||||
|
||||
@ -595,8 +596,7 @@ size_t RunSpecifiedBenchmarks(BenchmarkReporter* display_reporter,
|
||||
std::string const& fname = FLAGS_benchmark_out;
|
||||
if (fname.empty() && file_reporter) {
|
||||
Err << "A custom file reporter was provided but "
|
||||
"--benchmark_out=<file> was not specified."
|
||||
<< std::endl;
|
||||
"--benchmark_out=<file> was not specified.\n";
|
||||
Out.flush();
|
||||
Err.flush();
|
||||
std::exit(1);
|
||||
@ -604,7 +604,7 @@ size_t RunSpecifiedBenchmarks(BenchmarkReporter* display_reporter,
|
||||
if (!fname.empty()) {
|
||||
output_file.open(fname);
|
||||
if (!output_file.is_open()) {
|
||||
Err << "invalid file name: '" << fname << "'" << std::endl;
|
||||
Err << "invalid file name: '" << fname << "'\n";
|
||||
Out.flush();
|
||||
Err.flush();
|
||||
std::exit(1);
|
||||
@ -691,7 +691,9 @@ void (*HelperPrintf)();
|
||||
|
||||
void PrintUsageAndExit() {
|
||||
HelperPrintf();
|
||||
exit(0);
|
||||
std::flush(std::cout);
|
||||
std::flush(std::cerr);
|
||||
std::exit(0);
|
||||
}
|
||||
|
||||
void SetDefaultTimeUnitFromFlag(const std::string& time_unit_flag) {
|
||||
|
@ -125,7 +125,7 @@ bool BenchmarkFamilies::FindBenchmarks(
|
||||
is_negative_filter = true;
|
||||
}
|
||||
if (!re.Init(spec, &error_msg)) {
|
||||
Err << "Could not compile benchmark re: " << error_msg << std::endl;
|
||||
Err << "Could not compile benchmark re: " << error_msg << '\n';
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -36,6 +36,8 @@ AbortHandlerT*& GetAbortHandler();
|
||||
|
||||
BENCHMARK_NORETURN inline void CallAbortHandler() {
|
||||
GetAbortHandler()();
|
||||
std::flush(std::cout);
|
||||
std::flush(std::cerr);
|
||||
std::abort(); // fallback to enforce noreturn
|
||||
}
|
||||
|
||||
@ -57,7 +59,7 @@ class CheckHandler {
|
||||
#pragma warning(disable : 4722)
|
||||
#endif
|
||||
BENCHMARK_NORETURN ~CheckHandler() BENCHMARK_NOEXCEPT_OP(false) {
|
||||
log_ << std::endl;
|
||||
log_ << '\n';
|
||||
CallAbortHandler();
|
||||
}
|
||||
#if defined(COMPILER_MSVC)
|
||||
|
12
src/log.h
12
src/log.h
@ -4,13 +4,6 @@
|
||||
#include <iostream>
|
||||
#include <ostream>
|
||||
|
||||
// NOTE: this is also defined in benchmark.h but we're trying to avoid a
|
||||
// dependency.
|
||||
// The _MSVC_LANG check should detect Visual Studio 2015 Update 3 and newer.
|
||||
#if __cplusplus >= 201103L || (defined(_MSVC_LANG) && _MSVC_LANG >= 201103L)
|
||||
#define BENCHMARK_HAS_CXX11
|
||||
#endif
|
||||
|
||||
namespace benchmark {
|
||||
namespace internal {
|
||||
|
||||
@ -31,13 +24,8 @@ class LogType {
|
||||
|
||||
// NOTE: we could use BENCHMARK_DISALLOW_COPY_AND_ASSIGN but we shouldn't have
|
||||
// a dependency on benchmark.h from here.
|
||||
#ifndef BENCHMARK_HAS_CXX11
|
||||
LogType(const LogType&);
|
||||
LogType& operator=(const LogType&);
|
||||
#else
|
||||
LogType(const LogType&) = delete;
|
||||
LogType& operator=(const LogType&) = delete;
|
||||
#endif
|
||||
};
|
||||
|
||||
template <class Tp>
|
||||
|
@ -84,7 +84,7 @@
|
||||
namespace benchmark {
|
||||
namespace {
|
||||
|
||||
void PrintImp(std::ostream& out) { out << std::endl; }
|
||||
void PrintImp(std::ostream& out) { out << '\n'; }
|
||||
|
||||
template <class First, class... Rest>
|
||||
void PrintImp(std::ostream& out, First&& f, Rest&&... rest) {
|
||||
@ -95,6 +95,7 @@ void PrintImp(std::ostream& out, First&& f, Rest&&... rest) {
|
||||
template <class... Args>
|
||||
BENCHMARK_NORETURN void PrintErrorAndDie(Args&&... args) {
|
||||
PrintImp(std::cerr, std::forward<Args>(args)...);
|
||||
std::cerr << std::flush;
|
||||
std::exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
@ -540,8 +541,7 @@ class ThreadAffinityGuard final {
|
||||
ThreadAffinityGuard() : reset_affinity(SetAffinity()) {
|
||||
if (!reset_affinity)
|
||||
std::cerr << "***WARNING*** Failed to set thread affinity. Estimated CPU "
|
||||
"frequency may be incorrect."
|
||||
<< std::endl;
|
||||
"frequency may be incorrect.\n";
|
||||
}
|
||||
|
||||
~ThreadAffinityGuard() {
|
||||
|
@ -108,7 +108,8 @@ double MakeTime(struct timespec const& ts) {
|
||||
#endif
|
||||
|
||||
BENCHMARK_NORETURN static void DiagnoseAndExit(const char* msg) {
|
||||
std::cerr << "ERROR: " << msg << std::endl;
|
||||
std::cerr << "ERROR: " << msg << '\n';
|
||||
std::flush(std::cerr);
|
||||
std::exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
|
17
test/BUILD
17
test/BUILD
@ -98,28 +98,11 @@ cc_library(
|
||||
["*_test.cc"],
|
||||
exclude = [
|
||||
"*_assembly_test.cc",
|
||||
"cxx03_test.cc",
|
||||
"link_main_test.cc",
|
||||
],
|
||||
)
|
||||
]
|
||||
|
||||
cc_test(
|
||||
name = "cxx03_test",
|
||||
size = "small",
|
||||
srcs = ["cxx03_test.cc"],
|
||||
copts = TEST_COPTS + ["-std=c++03"],
|
||||
target_compatible_with = select({
|
||||
"//:windows": ["@platforms//:incompatible"],
|
||||
"//conditions:default": [],
|
||||
}),
|
||||
deps = [
|
||||
":output_test_helper",
|
||||
"//:benchmark",
|
||||
"//:benchmark_internal_headers",
|
||||
],
|
||||
)
|
||||
|
||||
cc_test(
|
||||
name = "link_main_test",
|
||||
size = "small",
|
||||
|
@ -1,4 +1,4 @@
|
||||
# Enable the tests
|
||||
#Enable the tests
|
||||
|
||||
set(THREADS_PREFER_PTHREAD_FLAG ON)
|
||||
|
||||
@ -198,32 +198,6 @@ benchmark_add_test(NAME profiler_manager_test COMMAND profiler_manager_test --be
|
||||
compile_benchmark_test(profiler_manager_iterations_test)
|
||||
benchmark_add_test(NAME profiler_manager_iterations COMMAND profiler_manager_iterations_test)
|
||||
|
||||
# MSVC does not allow to set the language standard to C++98/03.
|
||||
if(NOT (MSVC OR CMAKE_CXX_SIMULATE_ID STREQUAL "MSVC"))
|
||||
compile_benchmark_test(cxx03_test)
|
||||
set_target_properties(cxx03_test
|
||||
PROPERTIES
|
||||
CXX_STANDARD 98
|
||||
CXX_STANDARD_REQUIRED YES)
|
||||
# libstdc++ provides different definitions within <map> between dialects. When
|
||||
# LTO is enabled and -Werror is specified GCC diagnoses this ODR violation
|
||||
# causing the test to fail to compile. To prevent this we explicitly disable
|
||||
# the warning.
|
||||
check_cxx_compiler_flag(-Wno-odr BENCHMARK_HAS_WNO_ODR)
|
||||
check_cxx_compiler_flag(-Wno-lto-type-mismatch BENCHMARK_HAS_WNO_LTO_TYPE_MISMATCH)
|
||||
# Cannot set_target_properties multiple times here because the warnings will
|
||||
# be overwritten on each call
|
||||
set (DISABLE_LTO_WARNINGS "")
|
||||
if (BENCHMARK_HAS_WNO_ODR)
|
||||
set(DISABLE_LTO_WARNINGS "${DISABLE_LTO_WARNINGS} -Wno-odr")
|
||||
endif()
|
||||
if (BENCHMARK_HAS_WNO_LTO_TYPE_MISMATCH)
|
||||
set(DISABLE_LTO_WARNINGS "${DISABLE_LTO_WARNINGS} -Wno-lto-type-mismatch")
|
||||
endif()
|
||||
set_target_properties(cxx03_test PROPERTIES LINK_FLAGS "${DISABLE_LTO_WARNINGS}")
|
||||
benchmark_add_test(NAME cxx03 COMMAND cxx03_test --benchmark_min_time=0.01s)
|
||||
endif()
|
||||
|
||||
compile_output_test(complexity_test)
|
||||
benchmark_add_test(NAME complexity_benchmark COMMAND complexity_test --benchmark_min_time=1000000x)
|
||||
|
||||
@ -299,7 +273,7 @@ if (${CMAKE_BUILD_TYPE_LOWER} MATCHES "coverage")
|
||||
COMMAND ${LCOV} -q -a before.lcov -a after.lcov --output-file final.lcov
|
||||
COMMAND ${LCOV} -q -r final.lcov "'${CMAKE_SOURCE_DIR}/test/*'" -o final.lcov
|
||||
COMMAND ${GENHTML} final.lcov -o lcov --demangle-cpp --sort -p "${CMAKE_BINARY_DIR}" -t benchmark
|
||||
DEPENDS filter_test benchmark_test options_test basic_test fixture_test cxx03_test complexity_test
|
||||
DEPENDS filter_test benchmark_test options_test basic_test fixture_test complexity_test
|
||||
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
|
||||
COMMENT "Running LCOV"
|
||||
)
|
||||
|
@ -13,11 +13,11 @@ namespace {
|
||||
|
||||
class TestReporter : public benchmark::ConsoleReporter {
|
||||
public:
|
||||
virtual bool ReportContext(const Context& context) BENCHMARK_OVERRIDE {
|
||||
virtual bool ReportContext(const Context& context) override {
|
||||
return ConsoleReporter::ReportContext(context);
|
||||
};
|
||||
|
||||
virtual void ReportRuns(const std::vector<Run>& report) BENCHMARK_OVERRIDE {
|
||||
virtual void ReportRuns(const std::vector<Run>& report) override {
|
||||
assert(report.size() == 1);
|
||||
iter_nums_.push_back(report[0].iterations);
|
||||
ConsoleReporter::ReportRuns(report);
|
||||
|
@ -19,17 +19,17 @@ typedef int64_t IterationCount;
|
||||
|
||||
class TestReporter : public benchmark::ConsoleReporter {
|
||||
public:
|
||||
virtual bool ReportContext(const Context& context) BENCHMARK_OVERRIDE {
|
||||
virtual bool ReportContext(const Context& context) override {
|
||||
return ConsoleReporter::ReportContext(context);
|
||||
};
|
||||
|
||||
virtual void ReportRuns(const std::vector<Run>& report) BENCHMARK_OVERRIDE {
|
||||
virtual void ReportRuns(const std::vector<Run>& report) override {
|
||||
assert(report.size() == 1);
|
||||
ConsoleReporter::ReportRuns(report);
|
||||
};
|
||||
|
||||
virtual void ReportRunsConfig(double min_time, bool /* has_explicit_iters */,
|
||||
IterationCount /* iters */) BENCHMARK_OVERRIDE {
|
||||
IterationCount /* iters */) override {
|
||||
min_times_.push_back(min_time);
|
||||
}
|
||||
|
||||
|
@ -1,62 +0,0 @@
|
||||
#undef NDEBUG
|
||||
#include <cassert>
|
||||
#include <cstddef>
|
||||
|
||||
#include "benchmark/benchmark.h"
|
||||
|
||||
#if __cplusplus >= 201103L
|
||||
#error C++11 or greater detected. Should be C++03.
|
||||
#endif
|
||||
|
||||
#ifdef BENCHMARK_HAS_CXX11
|
||||
#error C++11 or greater detected by the library. BENCHMARK_HAS_CXX11 is defined.
|
||||
#endif
|
||||
|
||||
void BM_empty(benchmark::State& state) {
|
||||
while (state.KeepRunning()) {
|
||||
volatile benchmark::IterationCount x = state.iterations();
|
||||
((void)x);
|
||||
}
|
||||
}
|
||||
BENCHMARK(BM_empty);
|
||||
|
||||
// The new C++11 interface for args/ranges requires initializer list support.
|
||||
// Therefore we provide the old interface to support C++03.
|
||||
void BM_old_arg_range_interface(benchmark::State& state) {
|
||||
assert((state.range(0) == 1 && state.range(1) == 2) ||
|
||||
(state.range(0) == 5 && state.range(1) == 6));
|
||||
while (state.KeepRunning()) {
|
||||
}
|
||||
}
|
||||
BENCHMARK(BM_old_arg_range_interface)->ArgPair(1, 2)->RangePair(5, 5, 6, 6);
|
||||
|
||||
template <class T, class U>
|
||||
void BM_template2(benchmark::State& state) {
|
||||
BM_empty(state);
|
||||
}
|
||||
BENCHMARK_TEMPLATE2(BM_template2, int, long);
|
||||
|
||||
template <class T>
|
||||
void BM_template1(benchmark::State& state) {
|
||||
BM_empty(state);
|
||||
}
|
||||
BENCHMARK_TEMPLATE(BM_template1, long);
|
||||
BENCHMARK_TEMPLATE1(BM_template1, int);
|
||||
|
||||
template <class T>
|
||||
struct BM_Fixture : public ::benchmark::Fixture {};
|
||||
|
||||
BENCHMARK_TEMPLATE_F(BM_Fixture, BM_template1, long)(benchmark::State& state) {
|
||||
BM_empty(state);
|
||||
}
|
||||
BENCHMARK_TEMPLATE1_F(BM_Fixture, BM_template2, int)(benchmark::State& state) {
|
||||
BM_empty(state);
|
||||
}
|
||||
|
||||
void BM_counters(benchmark::State& state) {
|
||||
BM_empty(state);
|
||||
state.counters["Foo"] = 2;
|
||||
}
|
||||
BENCHMARK(BM_counters);
|
||||
|
||||
BENCHMARK_MAIN();
|
@ -80,7 +80,7 @@ int main(int argc, char* argv[]) {
|
||||
// This test is exercising functionality for debug builds, which are not
|
||||
// available in release builds. Skip the test if we are in that environment
|
||||
// to avoid a test failure.
|
||||
std::cout << "Diagnostic test disabled in release build" << std::endl;
|
||||
std::cout << "Diagnostic test disabled in release build\n";
|
||||
(void)argc;
|
||||
(void)argv;
|
||||
#else
|
||||
|
@ -90,7 +90,7 @@ int main(int argc, char** argv) {
|
||||
if (returned_count != expected_return) {
|
||||
std::cerr << "ERROR: Expected " << expected_return
|
||||
<< " tests to match the filter but returned_count = "
|
||||
<< returned_count << std::endl;
|
||||
<< returned_count << '\n';
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -99,7 +99,7 @@ int main(int argc, char** argv) {
|
||||
if (reports_count != expected_reports) {
|
||||
std::cerr << "ERROR: Expected " << expected_reports
|
||||
<< " tests to be run but reported_count = " << reports_count
|
||||
<< std::endl;
|
||||
<< '\n';
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -108,7 +108,7 @@ int main(int argc, char** argv) {
|
||||
if (num_families != expected_reports) {
|
||||
std::cerr << "ERROR: Expected " << expected_reports
|
||||
<< " test families to be run but num_families = "
|
||||
<< num_families << std::endl;
|
||||
<< num_families << '\n';
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
@ -21,7 +21,7 @@
|
||||
#define SET_SUBSTITUTIONS(...) \
|
||||
int CONCAT(dummy, __LINE__) = ::SetSubstitutions(__VA_ARGS__)
|
||||
|
||||
enum MatchRules {
|
||||
enum MatchRules : uint8_t {
|
||||
MR_Default, // Skip non-matching lines until a match is found.
|
||||
MR_Next, // Match must occur on the next line.
|
||||
MR_Not // No line between the current position and the next match matches
|
||||
@ -37,7 +37,7 @@ struct TestCase {
|
||||
std::shared_ptr<benchmark::Regex> regex;
|
||||
};
|
||||
|
||||
enum TestCaseID {
|
||||
enum TestCaseID : uint8_t {
|
||||
TC_ConsoleOut,
|
||||
TC_ConsoleErr,
|
||||
TC_JSONOut,
|
||||
@ -101,7 +101,7 @@ struct Results {
|
||||
|
||||
double NumIterations() const;
|
||||
|
||||
typedef enum { kCpuTime, kRealTime } BenchmarkTime;
|
||||
typedef enum : uint8_t { kCpuTime, kRealTime } BenchmarkTime;
|
||||
|
||||
// get cpu_time or real_time in seconds
|
||||
double GetTime(BenchmarkTime which) const;
|
||||
|
@ -490,8 +490,9 @@ static std::string GetTempFileName() {
|
||||
std::string name = GetRandomFileName();
|
||||
if (!FileExists(name)) return name;
|
||||
}
|
||||
std::cerr << "Failed to create unique temporary file name" << std::endl;
|
||||
std::abort();
|
||||
std::cerr << "Failed to create unique temporary file name\n";
|
||||
std::flush(std::cerr);
|
||||
std::exit(1);
|
||||
}
|
||||
|
||||
std::string GetFileReporterOutput(int argc, char* argv[]) {
|
||||
|
Loading…
Reference in New Issue
Block a user