Skip to content
Snippets Groups Projects
Commit 62dfc031 authored by Stuart Mark James's avatar Stuart Mark James
Browse files

Update build doc, added benchmark directory!

parent 5f94e79c
Branches
Tags
No related merge requests found
cmake_minimum_required(VERSION 3.6)
project(benchmark-tests)
set(CMAKE_VERBOSE_MAKEFILE ON)
set(CMAKE_COLOR_MAKEFILE ON)
set(BENCHMARK_SOURCES
${CMAKE_CURRENT_SOURCE_DIR}/QueryBuilderTests.cpp)
add_executable(benchmark-tests ${BENCHMARK_SOURCES})
target_compile_options(benchmark-tests PRIVATE -Wall -Wextra -g)
target_link_libraries(benchmark-tests
PRIVATE libhdbpp_headers libhdbpp_timescale_shared_library TangoInterfaceLibrary benchmark gtest)
target_include_directories(benchmark-tests
PRIVATE ${CMAKE_SOURCE_DIR}/src ${PROJECT_SOURCE_DIR})
target_compile_definitions(benchmark-tests
PRIVATE -DDEBUG_ENABLED)
set_target_properties(benchmark-tests
PROPERTIES
LINK_FLAGS "-Wl,--no-undefined"
CXX_CLANG_TIDY ${DO_CLANG_TIDY}
CXX_STANDARD 14)
\ No newline at end of file
/* Copyright (C) : 2014-2019
European Synchrotron Radiation Facility
BP 220, Grenoble 38043, FRANCE
This file is part of libhdb++timescale.
libhdb++timescale is free software: you can redistribute it and/or modify
it under the terms of the Lesser GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
libhdb++timescale is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser
GNU General Public License for more details.
You should have received a copy of the Lesser GNU General Public License
along with libhdb++timescale. If not, see <http://www.gnu.org/licenses/>. */
#include "QueryBuilder.hpp"
#include <benchmark/benchmark.h>
//=============================================================================
//=============================================================================
void bmAllocateQueryBuilder(benchmark::State& state)
{
// Test - Testing the time it takes to allocate a QueryBuilder, mainly for future test
// reference
hdbpp_internal::LogConfigurator::initLoggingMetrics(false, false);
hdbpp_internal::LogConfigurator::setLoggingLevel(spdlog::level::err);
for (auto _ : state)
hdbpp_internal::pqxx_conn::QueryBuilder query_builder;
}
BENCHMARK(bmAllocateQueryBuilder);
//=============================================================================
//=============================================================================
void bmTraitsComparator(benchmark::State& state)
{
// TEST - Test the AttributeTraits comparator used in the cache inside QueryBuilder,
// the test is against a full map with every possible tango traits combination
std::map<hdbpp_internal::AttributeTraits, std::string> trait_cache;
vector<Tango::CmdArgType> types {Tango::DEV_DOUBLE,
Tango::DEV_FLOAT,
Tango::DEV_STRING,
Tango::DEV_LONG,
Tango::DEV_ULONG,
Tango::DEV_LONG64,
Tango::DEV_ULONG64,
Tango::DEV_SHORT,
Tango::DEV_USHORT,
Tango::DEV_BOOLEAN,
Tango::DEV_UCHAR,
Tango::DEV_STATE,
Tango::DEV_ENCODED,
Tango::DEV_ENUM};
vector<Tango::AttrWriteType> write_types {Tango::READ, Tango::WRITE, Tango::READ_WRITE, Tango::READ_WITH_WRITE};
vector<Tango::AttrDataFormat> format_types {Tango::SCALAR, Tango::SPECTRUM, Tango::IMAGE};
for (auto &type : types)
{
for (auto &format : format_types)
{
for (auto &write : write_types)
{
// add to the cache for future hits
trait_cache.emplace(
hdbpp_internal::AttributeTraits{write, format, type},
to_string(write) + to_string(format) + to_string(type));
}
}
}
hdbpp_internal::AttributeTraits traits {Tango::READ, Tango::SCALAR, Tango::DEV_DOUBLE};
for (auto _ : state)
trait_cache.find(traits);
}
BENCHMARK(bmTraitsComparator);
//=============================================================================
//=============================================================================
static void writeTypeArgs(benchmark::internal::Benchmark* b)
{
vector<Tango::AttrWriteType> write_types {Tango::READ, Tango::WRITE, Tango::READ_WRITE, Tango::READ_WITH_WRITE};
for (auto & write_type : write_types)
b->Args({static_cast<int>(write_type)});
}
//=============================================================================
//=============================================================================
template<typename T>
void bmStoreDataEventQueryNoCache(benchmark::State& state)
{
// TEST - Testing how long it takes to build an Insert Data Event query with
// an empty cache (this forces the full string to be built)
hdbpp_internal::LogConfigurator::initLoggingMetrics(false, false);
hdbpp_internal::LogConfigurator::setLoggingLevel(spdlog::level::err);
hdbpp_internal::AttributeTraits traits
{static_cast<Tango::AttrWriteType>(state.range(0)), Tango::SCALAR, Tango::DEV_DOUBLE};
for (auto _ : state)
{
// define the builder here so its cache is always fresh
hdbpp_internal::pqxx_conn::QueryBuilder query_builder;
query_builder.storeDataEventQuery<T>(traits);
}
}
//=============================================================================
//=============================================================================
template<typename T>
void bmStoreDataEventQueryCache(benchmark::State& state)
{
// TEST - Testing the full lookup for an Insert Data QueryEvent query when the cache
// map is fully populated
hdbpp_internal::LogConfigurator::initLoggingMetrics(false, false);
hdbpp_internal::LogConfigurator::setLoggingLevel(spdlog::level::err);
hdbpp_internal::AttributeTraits traits
{static_cast<Tango::AttrWriteType>(state.range(0)), Tango::SCALAR, Tango::DEV_DOUBLE};
vector<Tango::CmdArgType> types {Tango::DEV_DOUBLE,
Tango::DEV_FLOAT,
Tango::DEV_STRING,
Tango::DEV_LONG,
Tango::DEV_ULONG,
Tango::DEV_LONG64,
Tango::DEV_ULONG64,
Tango::DEV_SHORT,
Tango::DEV_USHORT,
Tango::DEV_BOOLEAN,
Tango::DEV_UCHAR,
Tango::DEV_STATE,
Tango::DEV_ENCODED,
Tango::DEV_ENUM};
vector<Tango::AttrWriteType> write_types {Tango::READ, Tango::WRITE, Tango::READ_WRITE, Tango::READ_WITH_WRITE};
vector<Tango::AttrDataFormat> format_types {Tango::SCALAR, Tango::SPECTRUM, Tango::IMAGE};
hdbpp_internal::pqxx_conn::QueryBuilder query_builder;
for (auto &type : types)
for (auto &format : format_types)
for (auto &write : write_types)
query_builder.storeDataEventQuery<T>(hdbpp_internal::AttributeTraits{write, format, type});
for (auto _ : state)
query_builder.storeDataEventQuery<T>(traits);
}
BENCHMARK_TEMPLATE(bmStoreDataEventQueryNoCache, bool)->Apply(writeTypeArgs);
BENCHMARK_TEMPLATE(bmStoreDataEventQueryCache, bool)->Apply(writeTypeArgs);
BENCHMARK_MAIN();
\ No newline at end of file
......@@ -65,18 +65,20 @@ The following is a list of common useful CMake flags and their use:
| Flag | Setting | Default | Description |
|------|-----|-----|-----|
| HDBPP_TDB_BUILD_TESTS | ON/OFF | OFF | Build unit tests |
| HDBPP_TDB_BUILD_DEBUG_SYMBOLS | ON/OFF | OFF | Add additional debug systems to the library |
| HDBPP_TDB_ENABLE_CLANG | ON/OFF | OFF | Clang code static analysis, readability, and cppcore guideline enforcement |
| BUILD_UNIT_TESTS | ON/OFF | OFF | Build unit tests |
| BUILD_BENCHMARK_TESTS | ON/OFF | OFF | Build benchmark tests (Forces a Release build) |
| ENABLE_CLANG | ON/OFF | OFF | Clang code static analysis, readability, and cppcore guideline enforcement |
## Running Tests
### Unit Tests
The project has extensive unit tests to ensure its functioning as expect. Build the project with testing enabled:
```bash
mkdir -p build
cd build
cmake -DHDBPP_TDB_BUILD_TESTS=ON ..
cmake -DBUILD_UNIT_TESTS=ON ..
make
```
......@@ -103,3 +105,18 @@ To see more options for the unit-test command line binary:
```bash
./bin/unit-tests --help
```
### Benchmark Tests
These are a work in progress to explore future optimisation point. If built, they can be run as follows:
```bash
mkdir -p build
cd build
cmake -DBUILD_BENCHMARK_TESTS=ON ..
make
```
```bash
./benchmark/benchmark-tests
```
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment