init
This commit is contained in:
commit
3e9449cfbb
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
.cache/
|
||||||
|
build
|
||||||
|
compile_commands.json
|
||||||
14
CMakeLists.txt
Normal file
14
CMakeLists.txt
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.20)
|
||||||
|
|
||||||
|
project(divisionBench)
|
||||||
|
|
||||||
|
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
||||||
|
find_package(benchmark REQUIRED)
|
||||||
|
|
||||||
|
add_executable(${PROJECT_NAME} bench.cc)
|
||||||
|
|
||||||
|
target_link_libraries(${PROJECT_NAME} PRIVATE
|
||||||
|
benchmark::benchmark_main
|
||||||
|
benchmark::benchmark
|
||||||
|
)
|
||||||
|
|
||||||
9
CMakeUserPresets.json
Normal file
9
CMakeUserPresets.json
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"version": 4,
|
||||||
|
"vendor": {
|
||||||
|
"conan": {}
|
||||||
|
},
|
||||||
|
"include": [
|
||||||
|
"build/Release/generators/CMakePresets.json"
|
||||||
|
]
|
||||||
|
}
|
||||||
10
README.md
Normal file
10
README.md
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
## How to install & run
|
||||||
|
|
||||||
|
need to have conan installed
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#assume that you have conan default profile
|
||||||
|
conan install . --build=missing
|
||||||
|
cmake --build --preset=conan-release
|
||||||
|
# or just write name of your preset instead of conan-release
|
||||||
|
```
|
||||||
98
bench.cc
Normal file
98
bench.cc
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
#include "benchmark/benchmark.h"
|
||||||
|
#include <random>
|
||||||
|
#include <type_traits>
|
||||||
|
|
||||||
|
static thread_local std::mt19937_64 rng(std::random_device {}());
|
||||||
|
|
||||||
|
template <typename T, std::enable_if_t<std::is_integral_v<T>, int> = 0>
|
||||||
|
std::vector<T> prepareRandData(int size)
|
||||||
|
{
|
||||||
|
std::uniform_int_distribution<T> dist(1, 1000000);
|
||||||
|
std::vector<T> result;
|
||||||
|
for (int i = 0; i < size; ++i) {
|
||||||
|
result.push_back(dist(rng));
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T, std::enable_if_t<std::is_floating_point_v<T>, int> = 0>
|
||||||
|
std::vector<T> prepareRandData(int size)
|
||||||
|
{
|
||||||
|
std::uniform_real_distribution<T> dist(1, 1000000);
|
||||||
|
std::vector<T> result;
|
||||||
|
for (int i = 0; i < size; ++i) {
|
||||||
|
result.push_back(dist(rng));
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
static constexpr int arrSize = 1 << 20;
|
||||||
|
static constexpr int bitmask = arrSize - 1;
|
||||||
|
static void int64_division(benchmark::State& state)
|
||||||
|
{
|
||||||
|
std::vector a = prepareRandData<int64_t>(arrSize);
|
||||||
|
std::vector b = prepareRandData<int64_t>(arrSize);
|
||||||
|
int64_t i = 0, i2 = 0;
|
||||||
|
for (auto _ : state) {
|
||||||
|
benchmark::DoNotOptimize(a[i++ & bitmask] / b[i2++ & bitmask]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void double_division(benchmark::State& state)
|
||||||
|
{
|
||||||
|
std::vector a = prepareRandData<double>(arrSize);
|
||||||
|
std::vector b = prepareRandData<double>(arrSize);
|
||||||
|
int64_t i = 0, i2 = 0;
|
||||||
|
for (auto _ : state) {
|
||||||
|
benchmark::DoNotOptimize(a[i++ & bitmask] / b[i2++ & bitmask]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void DoNothing(benchmark::State& state)
|
||||||
|
{
|
||||||
|
while (state.KeepRunning())
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void BM_IntDivision(benchmark::State& state)
|
||||||
|
{
|
||||||
|
volatile int a = 123456789;
|
||||||
|
volatile int b = 123;
|
||||||
|
int result;
|
||||||
|
for (auto _ : state) {
|
||||||
|
result = a / b;
|
||||||
|
benchmark::DoNotOptimize(result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
BENCHMARK(BM_IntDivision);
|
||||||
|
|
||||||
|
static void BM_FloatDivision(benchmark::State& state)
|
||||||
|
{
|
||||||
|
volatile float a = 123456789.0f;
|
||||||
|
volatile float b = 123.0f;
|
||||||
|
float result;
|
||||||
|
for (auto _ : state) {
|
||||||
|
result = a / b;
|
||||||
|
benchmark::DoNotOptimize(result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
BENCHMARK(BM_FloatDivision);
|
||||||
|
|
||||||
|
static void BM_DoubleDivision(benchmark::State& state)
|
||||||
|
{
|
||||||
|
volatile double a = 123456789.0;
|
||||||
|
volatile double b = 123.0;
|
||||||
|
double result;
|
||||||
|
for (auto _ : state) {
|
||||||
|
result = a / b;
|
||||||
|
benchmark::DoNotOptimize(result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
BENCHMARK(BM_DoubleDivision);
|
||||||
|
|
||||||
|
BENCHMARK(DoNothing);
|
||||||
|
|
||||||
|
BENCHMARK(int64_division);
|
||||||
|
BENCHMARK(double_division);
|
||||||
|
|
||||||
|
BENCHMARK_MAIN();
|
||||||
8
conanfile.txt
Normal file
8
conanfile.txt
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
[requires]
|
||||||
|
benchmark/1.9.1
|
||||||
|
|
||||||
|
[generators]
|
||||||
|
CMakeDeps
|
||||||
|
CMakeToolchain
|
||||||
|
[layout]
|
||||||
|
cmake_layout
|
||||||
Loading…
x
Reference in New Issue
Block a user