Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 0 additions & 10 deletions NOTICE.txt
Original file line number Diff line number Diff line change
Expand Up @@ -216,13 +216,3 @@ In addition, certain files include the notices provided below.
// shall not be used in advertising or otherwise to promote the sale,
// use or other dealings in these Data Files or Software without prior
// written authorization of the copyright holder.

----------------------

/* Written in 2018 by David Blackman and Sebastiano Vigna ([email protected])

To the extent possible under law, the author has dedicated all copyright
and related and neighboring rights to this software to the public domain
worldwide. This software is distributed without any warranty.

See <http://creativecommons.org/publicdomain/zero/1.0/>. */
35 changes: 12 additions & 23 deletions benchmarks/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -46,23 +46,15 @@ set_property(CACHE STL_BENCHMARK_MSVC_RUNTIME_LIBRARY
)
set(CMAKE_MSVC_RUNTIME_LIBRARY "${STL_BENCHMARK_MSVC_RUNTIME_LIBRARY}")

set(STL_BENCHMARK_ITERATOR_DEBUG_LEVEL
default
CACHE STRING "What level of iterator debugging to use."
)
set_property(CACHE STL_BENCHMARK_ITERATOR_DEBUG_LEVEL
PROPERTY STRINGS
"default;0;1;2"
)

if(NOT STL_BENCHMARK_ITERATOR_DEBUG_LEVEL STREQUAL "default")
add_compile_definitions("_ITERATOR_DEBUG_LEVEL=${STL_BENCHMARK_ITERATOR_DEBUG_LEVEL}")
endif()

set(CMAKE_BUILD_TYPE RelWithDebInfo)
# Building the benchmarks as Release optimizes them with `/O2 /Ob2`.
# Compiling with `/Zi` and linking with `/DEBUG` below makes profiling possible.
# (RelWithDebInfo would use `/O2 /Ob1 /Zi`.) See GH-4496.
set(CMAKE_BUILD_TYPE Release)

# /utf-8 affects <format>.
add_compile_options("$<$<COMPILE_LANGUAGE:CXX>:/diagnostics:caret;/W4;/WX;/w14265;/w15038;/w15262;/utf-8;/Zc:preprocessor>")
add_compile_options("$<$<COMPILE_LANGUAGE:CXX>:/Zi;/nologo;/diagnostics:caret;/W4;/WX;/w14265;/w15038;/w15262;/utf-8;/Zc:preprocessor>")

add_link_options("/DEBUG")

if(NOT EXISTS "${CMAKE_CURRENT_LIST_DIR}/google-benchmark/.git")
message(FATAL_ERROR "google-benchmark is not checked out; make sure to run\n git submodule update --init benchmarks/google-benchmark")
Expand All @@ -72,15 +64,13 @@ set(BENCHMARK_ENABLE_DOXYGEN OFF)
set(BENCHMARK_ENABLE_INSTALL OFF)
set(BENCHMARK_ENABLE_TESTING OFF)

set(HAVE_GNU_POSIX_REGEX OFF)
set(HAVE_POSIX_REGEX OFF)

add_subdirectory(google-benchmark EXCLUDE_FROM_ALL)

set(benchmark_headers
"inc/lorem.hpp"
"inc/skewed_allocator.hpp"
"inc/udt.hpp"
"inc/utility.hpp"
"inc/xoshiro.hpp"
)

function(add_benchmark name)
Expand Down Expand Up @@ -130,7 +120,6 @@ add_benchmark(std_copy src/std_copy.cpp)
add_benchmark(sv_equal src/sv_equal.cpp)
add_benchmark(swap_ranges src/swap_ranges.cpp)
add_benchmark(unique src/unique.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)
add_benchmark(vector_bool_move src/std/containers/sequences/vector.bool/move/test.cpp)
add_benchmark(vector_bool_copy src/vector_bool_copy.cpp)
add_benchmark(vector_bool_copy_n src/vector_bool_copy_n.cpp)
add_benchmark(vector_bool_move src/vector_bool_move.cpp)
2 changes: 1 addition & 1 deletion benchmarks/google-benchmark
Submodule google-benchmark updated 99 files
+35 −4 .clang-tidy
+1 −0 .clang-tidy.ignore
+14 −5 .github/libcxx-setup.sh
+6 −4 .github/workflows/bazel.yml
+3 −0 .github/workflows/build-and-test-min-cmake.yml
+3 −0 .github/workflows/build-and-test-perfcounters.yml
+30 −40 .github/workflows/build-and-test.yml
+5 −4 .github/workflows/clang-format-lint.yml
+7 −4 .github/workflows/clang-tidy-lint.yml
+3 −0 .github/workflows/doxygen.yml
+3 −0 .github/workflows/pre-commit.yml
+3 −2 .github/workflows/sanitizer.yml
+3 −0 .github/workflows/test_bindings.yml
+7 −16 .github/workflows/wheels.yml
+3 −3 .pre-commit-config.yaml
+4 −4 .ycm_extra_conf.py
+6 −18 BUILD.bazel
+10 −11 CMakeLists.txt
+4 −5 MODULE.bazel
+2 −2 README.md
+0 −4 WORKSPACE
+0 −8 bazel/benchmark_deps.bzl
+1 −0 bindings/python/google_benchmark/BUILD
+9 −8 bindings/python/google_benchmark/__init__.py
+3 −3 bindings/python/google_benchmark/example.py
+2 −2 cmake/CXXFeatureCheck.cmake
+1 −0 cmake/Config.cmake.in
+3 −2 cmake/GoogleTest.cmake.in
+7 −12 docs/user_guide.md
+110 −233 include/benchmark/benchmark.h
+4 −3 pyproject.toml
+6 −9 setup.py
+3 −0 src/CMakeLists.txt
+69 −36 src/benchmark.cc
+5 −6 src/benchmark_api_internal.cc
+5 −6 src/benchmark_api_internal.h
+1 −1 src/benchmark_main.cc
+2 −2 src/benchmark_name.cc
+36 −18 src/benchmark_register.cc
+48 −36 src/benchmark_runner.cc
+4 −7 src/benchmark_runner.h
+4 −1 src/check.cc
+11 −5 src/check.h
+4 −2 src/colorprint.cc
+36 −13 src/commandlineflags.cc
+4 −0 src/commandlineflags.h
+3 −1 src/complexity.cc
+13 −11 src/console_reporter.cc
+8 −6 src/counter.cc
+10 −4 src/csv_reporter.cc
+13 −1 src/cycleclock.h
+22 −16 src/json_reporter.cc
+0 −12 src/log.h
+3 −5 src/re.h
+17 −8 src/reporter.cc
+32 −14 src/statistics.cc
+17 −8 src/string_util.cc
+0 −1 src/string_util.h
+118 −110 src/sysinfo.cc
+14 −10 src/timers.cc
+13 −10 test/BUILD
+18 −27 test/CMakeLists.txt
+2 −4 test/basic_test.cc
+9 −8 test/benchmark_min_time_flag_iters_test.cc
+13 −12 test/benchmark_min_time_flag_time_test.cc
+3 −2 test/benchmark_random_interleaving_gtest.cc
+126 −0 test/benchmark_setup_teardown_cb_types_gtest.cc
+9 −3 test/benchmark_setup_teardown_test.cc
+30 −20 test/benchmark_test.cc
+18 −16 test/complexity_test.cc
+0 −62 test/cxx03_test.cc
+12 −0 test/cxx11_test.cc
+17 −7 test/diagnostics_test.cc
+2 −4 test/donotoptimize_test.cc
+6 −5 test/filter_test.cc
+2 −1 test/internal_threading_test.cc
+2 −1 test/link_main_test.cc
+1 −1 test/map_test.cc
+2 −1 test/memory_manager_test.cc
+101 −0 test/memory_results_gtest.cc
+8 −6 test/output_test.h
+67 −30 test/output_test_helper.cc
+6 −2 test/perf_counters_gtest.cc
+62 −0 test/profiler_manager_iterations_test.cc
+1 −0 test/profiler_manager_test.cc
+7 −12 test/register_benchmark_test.cc
+7 −4 test/reporter_output_test.cc
+8 −5 test/skip_with_error_test.cc
+94 −90 test/string_util_gtest.cc
+1 −1 test/time_unit_gtest.cc
+4 −2 test/user_counters_tabular_test.cc
+14 −7 test/user_counters_test.cc
+2 −1 test/user_counters_thousands_test.cc
+1 −0 tools/BUILD.bazel
+28 −7 tools/compare.py
+67 −51 tools/gbench/report.py
+24 −26 tools/gbench/util.py
+229 −9 tools/libpfm.BUILD.bazel
+7 −7 tools/strip_asm.py
9 changes: 2 additions & 7 deletions benchmarks/inc/utility.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,12 @@

#include <algorithm>
#include <cstddef>
#include <cstdint>
#include <random>
#include <vector>

#include <xoshiro.hpp>

template <class Contained>
std::vector<Contained> random_vector(size_t n) {
std::random_device rd;
std::uniform_int_distribution<std::uint64_t> id64;
xoshiro256ss prng{id64(rd), id64(rd), id64(rd), id64(rd)};
std::mt19937_64 prng;

std::vector<Contained> res(n);

Expand All @@ -25,7 +20,7 @@ std::vector<Contained> random_vector(size_t n) {
// but is insufficient for aggregate<Data> or non_trivial<Data>.
#pragma warning(push)
#pragma warning(disable : 4244) // warning C4244: conversion from 'uint64_t' to 'Data', possible loss of data
std::generate(res.begin(), res.end(), [&prng] { return static_cast<Contained>(prng.next()); });
std::generate(res.begin(), res.end(), [&prng] { return static_cast<Contained>(prng()); });
#pragma warning(pop)

return res;
Expand Down
42 changes: 0 additions & 42 deletions benchmarks/inc/xoshiro.hpp

This file was deleted.

139 changes: 68 additions & 71 deletions benchmarks/src/bitset_from_string.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,89 +12,86 @@

using namespace std;

namespace {
template <size_t N, class charT, size_t Min_length>
auto random_digits_init() {
mt19937_64 rnd{};
uniform_int_distribution<> dis('0', '1');
template <size_t N, class charT, size_t Min_length>
auto random_digits_init() {
mt19937_64 rnd{};
uniform_int_distribution<> dis('0', '1');

constexpr size_t number_of_bitsets = (Min_length + N - 1) / N;
static_assert(number_of_bitsets != 0);
constexpr size_t number_of_bitsets = (Min_length + N - 1) / N;
static_assert(number_of_bitsets != 0);

constexpr size_t actual_size = number_of_bitsets * (N + 1); // +1 for \0
constexpr size_t actual_size = number_of_bitsets * (N + 1); // +1 for \0

array<charT, actual_size> result;
array<charT, actual_size> result;

for (size_t i = 0; i < actual_size; ++i) {
if (i % (N + 1) == N) {
result[i] = charT{'\0'}; // write null terminators
} else {
result[i] = static_cast<charT>(dis(rnd)); // fill random digits
}
for (size_t i = 0; i < actual_size; ++i) {
if (i % (N + 1) == N) {
result[i] = charT{'\0'}; // write null terminators
} else {
result[i] = static_cast<charT>(dis(rnd)); // fill random digits
}

return result;
}

enum class length_type : bool { char_count, null_term };

template <size_t N, class charT>
const auto random_digits = random_digits_init<N, charT, 2048>();

template <length_type Length, size_t N, class charT>
void bitset_from_string(benchmark::State& state) {
const auto& digit_array = random_digits<N, charT>;
for (auto _ : state) {
benchmark::DoNotOptimize(digit_array);
const auto arr_data = digit_array.data();
const auto arr_size = digit_array.size();
for (size_t pos = 0; pos != arr_size; pos += N + 1) {
if constexpr (Length == length_type::char_count) {
bitset<N> bs(arr_data + pos, N);
benchmark::DoNotOptimize(bs);
} else {
bitset<N> bs(arr_data + pos);
benchmark::DoNotOptimize(bs);
}
return result;
}

enum class length_type : bool { char_count, null_term };

template <size_t N, class charT>
const auto random_digits = random_digits_init<N, charT, 2048>();

template <length_type Length, size_t N, class charT>
void bitset_from_string(benchmark::State& state) {
const auto& digit_array = random_digits<N, charT>;
for (auto _ : state) {
benchmark::DoNotOptimize(digit_array);
const auto arr_data = digit_array.data();
const auto arr_size = digit_array.size();
for (size_t pos = 0; pos != arr_size; pos += N + 1) {
if constexpr (Length == length_type::char_count) {
bitset<N> bs(arr_data + pos, N);
benchmark::DoNotOptimize(bs);
} else {
bitset<N> bs(arr_data + pos);
benchmark::DoNotOptimize(bs);
}
}
}

template <class charT, size_t Length>
basic_string<charT> random_digits_contiguous_string_init() {
mt19937_64 rnd{};
uniform_int_distribution<> dis('0', '1');

basic_string<charT> result;

result.resize_and_overwrite(Length, [&](charT* ptr, size_t) {
generate_n(ptr, Length, [&] { return static_cast<charT>(dis(rnd)); });
return Length;
});

return result;
}

template <class charT, size_t Length>
const auto random_digits_contiguous_string = random_digits_contiguous_string_init<charT, Length>();

template <size_t N, class charT>
void bitset_from_stream(benchmark::State& state) {
constexpr size_t string_length = 2048;
constexpr size_t count = string_length / N;
basic_istringstream<charT> stream(random_digits_contiguous_string<charT, string_length>);
bitset<N> bs;
for (auto _ : state) {
benchmark::DoNotOptimize(stream);
for (size_t i = 0; i != count; ++i) {
stream >> bs;
}
benchmark::DoNotOptimize(bs);
stream.seekg(0);
}

template <class charT, size_t Length>
basic_string<charT> random_digits_contiguous_string_init() {
mt19937_64 rnd{};
uniform_int_distribution<> dis('0', '1');

basic_string<charT> result;

result.resize_and_overwrite(Length, [&](charT* ptr, size_t) {
generate_n(ptr, Length, [&] { return static_cast<charT>(dis(rnd)); });
return Length;
});

return result;
}

template <class charT, size_t Length>
const auto random_digits_contiguous_string = random_digits_contiguous_string_init<charT, Length>();

template <size_t N, class charT>
void bitset_from_stream(benchmark::State& state) {
constexpr size_t string_length = 2048;
constexpr size_t count = string_length / N;
basic_istringstream<charT> stream(random_digits_contiguous_string<charT, string_length>);
bitset<N> bs;
for (auto _ : state) {
benchmark::DoNotOptimize(stream);
for (size_t i = 0; i != count; ++i) {
stream >> bs;
}
benchmark::DoNotOptimize(bs);
stream.seekg(0);
}

} // namespace
}

BENCHMARK(bitset_from_string<length_type::char_count, 15, char>);
BENCHMARK(bitset_from_string<length_type::char_count, 16, char>);
Expand Down
58 changes: 28 additions & 30 deletions benchmarks/src/bitset_to_string.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,45 +12,43 @@

using namespace std;

namespace {
template <size_t Elems>
auto random_bits_init() {
mt19937_64 rnd{};
array<uint64_t, Elems> arr;
for (auto& d : arr) {
d = rnd();
}
return arr;
template <size_t Elems>
auto random_bits_init() {
mt19937_64 rnd{};
array<uint64_t, Elems> arr;
for (auto& d : arr) {
d = rnd();
}
return arr;
}

template <size_t Elems = 32>
const auto random_bits = random_bits_init<Elems>();
template <size_t Elems = 32>
const auto random_bits = random_bits_init<Elems>();

template <size_t N, class charT>
void BM_bitset_to_string(benchmark::State& state) {
static_assert(N <= 64);
template <size_t N, class charT>
void BM_bitset_to_string(benchmark::State& state) {
static_assert(N <= 64);

for (auto _ : state) {
for (const auto& bits : random_bits<>) {
benchmark::DoNotOptimize(bits);
bitset<N> bs{bits};
benchmark::DoNotOptimize(bs.to_string<charT>());
}
for (auto _ : state) {
for (const auto& bits : random_bits<>) {
benchmark::DoNotOptimize(bits);
bitset<N> bs{bits};
benchmark::DoNotOptimize(bs.to_string<charT>());
}
}
}

template <size_t N, class charT>
void BM_bitset_to_string_large_single(benchmark::State& state) {
static_assert(N % 64 == 0 && N >= 64);
const auto& bitset_data = random_bits<N / 64>;
template <size_t N, class charT>
void BM_bitset_to_string_large_single(benchmark::State& state) {
static_assert(N % 64 == 0 && N >= 64);
const auto& bitset_data = random_bits<N / 64>;

const auto large_bitset = bit_cast<bitset<N>>(bitset_data);
for (auto _ : state) {
benchmark::DoNotOptimize(large_bitset);
benchmark::DoNotOptimize(large_bitset.to_string<charT>());
}
const auto large_bitset = bit_cast<bitset<N>>(bitset_data);
for (auto _ : state) {
benchmark::DoNotOptimize(large_bitset);
benchmark::DoNotOptimize(large_bitset.to_string<charT>());
}
} // namespace
}

BENCHMARK(BM_bitset_to_string<15, char>);
BENCHMARK(BM_bitset_to_string<64, char>);
Expand Down
Loading