From 35f4bcd31ee84f42e0f91a236353a15d437104d7 Mon Sep 17 00:00:00 2001 From: elsid Date: Sun, 23 Apr 2023 15:57:10 +0200 Subject: [PATCH] Run openmw_settings_access_benchmark in CI Add benchmarks to access 2 and 3 settings. Use settings with max memory address distance assuming Settings::Values is single memory location object. Use settings-default.cfg from the source code repository to initialize settings. --- .gitlab-ci.yml | 1 + apps/benchmarks/settings/CMakeLists.txt | 3 + apps/benchmarks/settings/access.cpp | 118 ++++++++++++++++-------- components/settings/values.hpp | 3 + 4 files changed, 89 insertions(+), 36 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 5d37548bc8..5ab3b8a85a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -74,6 +74,7 @@ Ubuntu_GCC_preprocess: - if [[ "${BUILD_TESTS_ONLY}" ]]; then ./openmw-cs-tests --gtest_output="xml:openmw_cs_tests.xml"; fi - if [[ "${BUILD_TESTS_ONLY}" && ! "${BUILD_WITH_CODE_COVERAGE}" ]]; then ./openmw_detournavigator_navmeshtilescache_benchmark; fi - if [[ "${BUILD_TESTS_ONLY}" && ! "${BUILD_WITH_CODE_COVERAGE}" ]]; then ./openmw_esm_refid_benchmark; fi + - if [[ "${BUILD_TESTS_ONLY}" && ! "${BUILD_WITH_CODE_COVERAGE}" ]]; then ./openmw_settings_access_benchmark; fi - ccache -s - df -h - if [[ "${BUILD_WITH_CODE_COVERAGE}" ]]; then gcovr --xml-pretty --exclude-unreachable-branches --print-summary --root "${CI_PROJECT_DIR}" -j $(nproc) -o ../coverage.xml; fi diff --git a/apps/benchmarks/settings/CMakeLists.txt b/apps/benchmarks/settings/CMakeLists.txt index bc2f8cd44b..8e3bd7375d 100644 --- a/apps/benchmarks/settings/CMakeLists.txt +++ b/apps/benchmarks/settings/CMakeLists.txt @@ -1,6 +1,9 @@ openmw_add_executable(openmw_settings_access_benchmark access.cpp) target_link_libraries(openmw_settings_access_benchmark benchmark::benchmark components) +target_compile_definitions(openmw_settings_access_benchmark + PRIVATE OPENMW_PROJECT_SOURCE_DIR=u8"${PROJECT_SOURCE_DIR}") + if (UNIX AND NOT APPLE) target_link_libraries(openmw_settings_access_benchmark ${CMAKE_THREAD_LIBS_INIT}) endif() diff --git a/apps/benchmarks/settings/access.cpp b/apps/benchmarks/settings/access.cpp index 468debec91..83c1199aa0 100644 --- a/apps/benchmarks/settings/access.cpp +++ b/apps/benchmarks/settings/access.cpp @@ -1,32 +1,36 @@ #include -#include -#include -#include - -#include - -#include -#include +#include "components/misc/strings/conversion.hpp" +#include "components/settings/parser.hpp" +#include "components/settings/settings.hpp" +#include "components/settings/values.hpp" namespace { - namespace bpo = boost::program_options; + void settingsManager(benchmark::State& state) + { + for (auto _ : state) + { + benchmark::DoNotOptimize(Settings::Manager::getFloat("sky blending start", "Fog")); + } + } - bpo::options_description makeOptionsDescription() + void settingsManager2(benchmark::State& state) { - bpo::options_description result; - auto addOption = result.add_options(); - addOption("help", "print help message"); - Files::ConfigurationManager::addCommonOptions(result); - return result; + for (auto _ : state) + { + benchmark::DoNotOptimize(Settings::Manager::getFloat("near clip", "Camera")); + benchmark::DoNotOptimize(Settings::Manager::getBool("transparent postpass", "Post Processing")); + } } - void settingsManager(benchmark::State& state) + void settingsManager3(benchmark::State& state) { for (auto _ : state) { - benchmark::DoNotOptimize(Settings::Manager::getFloat("sky blending start", "Fog")); + benchmark::DoNotOptimize(Settings::Manager::getFloat("near clip", "Camera")); + benchmark::DoNotOptimize(Settings::Manager::getBool("transparent postpass", "Post Processing")); + benchmark::DoNotOptimize(Settings::Manager::getInt("reflection detail", "Water")); } } @@ -39,6 +43,30 @@ namespace } } + void localStatic2(benchmark::State& state) + { + for (auto _ : state) + { + static const float v1 = Settings::Manager::getFloat("near clip", "Camera"); + static const bool v2 = Settings::Manager::getBool("transparent postpass", "Post Processing"); + benchmark::DoNotOptimize(v1); + benchmark::DoNotOptimize(v2); + } + } + + void localStatic3(benchmark::State& state) + { + for (auto _ : state) + { + static const float v1 = Settings::Manager::getFloat("near clip", "Camera"); + static const bool v2 = Settings::Manager::getBool("transparent postpass", "Post Processing"); + static const int v3 = Settings::Manager::getInt("reflection detail", "Water"); + benchmark::DoNotOptimize(v1); + benchmark::DoNotOptimize(v2); + benchmark::DoNotOptimize(v3); + } + } + void settingsStorage(benchmark::State& state) { for (auto _ : state) @@ -46,37 +74,55 @@ namespace benchmark::DoNotOptimize(Settings::fog().mSkyBlendingStart.get()); } } + + void settingsStorage2(benchmark::State& state) + { + for (auto _ : state) + { + benchmark::DoNotOptimize(Settings::postProcessing().mTransparentPostpass.get()); + benchmark::DoNotOptimize(Settings::camera().mNearClip.get()); + } + } + + void settingsStorage3(benchmark::State& state) + { + for (auto _ : state) + { + benchmark::DoNotOptimize(Settings::postProcessing().mTransparentPostpass.get()); + benchmark::DoNotOptimize(Settings::camera().mNearClip.get()); + benchmark::DoNotOptimize(Settings::water().mReflectionDetail.get()); + } + } } BENCHMARK(settingsManager); BENCHMARK(localStatic); BENCHMARK(settingsStorage); -int main(int argc, char* argv[]) -{ - bpo::options_description desc = makeOptionsDescription(); +BENCHMARK(settingsManager2); +BENCHMARK(localStatic2); +BENCHMARK(settingsStorage2); - bpo::parsed_options options = bpo::command_line_parser(argc, argv).options(desc).allow_unregistered().run(); - bpo::variables_map variables; +BENCHMARK(settingsManager3); +BENCHMARK(localStatic3); +BENCHMARK(settingsStorage3); - bpo::store(options, variables); - bpo::notify(variables); +int main(int argc, char* argv[]) +{ + const std::filesystem::path settingsDefaultPath = std::filesystem::path{ OPENMW_PROJECT_SOURCE_DIR } / "files" + / Misc::StringUtils::stringToU8String("settings-default.cfg"); - if (variables.find("help") != variables.end()) - { - std::cout << desc << std::endl; - benchmark::Initialize(&argc, argv); - benchmark::Shutdown(); - return 1; - } + Settings::SettingsFileParser parser; + parser.loadSettingsFile(settingsDefaultPath, Settings::Manager::mDefaultSettings); - Files::ConfigurationManager config; + Settings::Values::initDefaults(); - bpo::variables_map composingVariables = Files::separateComposingVariables(variables, desc); - config.readConfiguration(variables, desc); - Files::mergeComposingVariables(variables, composingVariables, desc); + Settings::Manager::mUserSettings = Settings::Manager::mDefaultSettings; + Settings::Manager::mUserSettings.erase({ "Camera", "near clip" }); + Settings::Manager::mUserSettings.erase({ "Post Processing", "transparent postpass" }); + Settings::Manager::mUserSettings.erase({ "Water", "reflection detail" }); - Settings::Manager::load(config); + Settings::Values::init(); benchmark::Initialize(&argc, argv); benchmark::RunSpecifiedBenchmarks(); diff --git a/components/settings/values.hpp b/components/settings/values.hpp index b95cc1885d..b5b26a97fe 100644 --- a/components/settings/values.hpp +++ b/components/settings/values.hpp @@ -27,6 +27,8 @@ #include "categories/water.hpp" #include "categories/windows.hpp" +#include + namespace Settings { class Values @@ -70,6 +72,7 @@ namespace Settings inline Values& values() { + assert(Values::sValues != nullptr); return *Values::sValues; }