From 7deea900fbef7d30a71f503b0fa78d4929aafafe Mon Sep 17 00:00:00 2001 From: Lion Kortlepel Date: Wed, 24 Jan 2024 00:17:42 +0100 Subject: [PATCH] add Util.DebugExecutionTime --- CMakeLists.txt | 2 ++ include/Profiling.h | 3 +++ include/TLuaEngine.h | 4 ++++ src/Profiling.cpp | 11 ++++++++++- src/TLuaEngine.cpp | 17 ++++++++++++++++- 5 files changed, 35 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e53fab1..68d1036 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -49,6 +49,7 @@ set(PRJ_HEADERS include/TServer.h include/VehicleData.h include/Env.h + include/Profiling.h ) # add all source files (.cpp) to this, except the one with main() set(PRJ_SOURCES @@ -72,6 +73,7 @@ set(PRJ_SOURCES src/TServer.cpp src/VehicleData.cpp src/Env.cpp + src/Profiling.cpp ) find_package(Lua REQUIRED) diff --git a/include/Profiling.h b/include/Profiling.h index 21b0784..12afd51 100644 --- a/include/Profiling.h +++ b/include/Profiling.h @@ -45,6 +45,9 @@ struct UnitProfileCollection { /// Returns the number of elements the moving average is calculated over. size_t measurement_count(const std::string& unit); + /// Returns the averages for all stored units. + std::unordered_map all_average_durations(); + private: boost::synchronized_value> m_map; }; diff --git a/include/TLuaEngine.h b/include/TLuaEngine.h index b4c14b0..a125b0f 100644 --- a/include/TLuaEngine.h +++ b/include/TLuaEngine.h @@ -18,9 +18,11 @@ #pragma once +#include "Profiling.h" #include "TNetwork.h" #include "TServer.h" #include +#include #include #include #include @@ -253,6 +255,8 @@ private: sol::table Lua_FS_ListFiles(const std::string& Path); sol::table Lua_FS_ListDirectories(const std::string& Path); + prof::UnitProfileCollection mProfile {}; + std::string mName; TLuaStateId mStateId; lua_State* mState; diff --git a/src/Profiling.cpp b/src/Profiling.cpp index 8013df2..dd267fc 100644 --- a/src/Profiling.cpp +++ b/src/Profiling.cpp @@ -36,6 +36,15 @@ void prof::UnitExecutionTime::add_sample(const Duration& dur) { } prof::UnitExecutionTime::UnitExecutionTime() - : m_measurements(boost::circular_buffer(16)) { + : m_measurements(boost::circular_buffer(100)) { +} + +std::unordered_map prof::UnitProfileCollection::all_average_durations() { + auto map = m_map.synchronize(); + std::unordered_map result {}; + for (const auto& [name, time] : *map) { + result[name] = time.average_duration().count(); + } + return result; } diff --git a/src/TLuaEngine.cpp b/src/TLuaEngine.cpp index 5dff14e..8330fc3 100644 --- a/src/TLuaEngine.cpp +++ b/src/TLuaEngine.cpp @@ -21,11 +21,13 @@ #include "CustomAssert.h" #include "Http.h" #include "LuaAPI.h" +#include "Profiling.h" #include "TLuaPlugin.h" #include "sol/object.hpp" #include #include +#include #include #include #include @@ -847,6 +849,15 @@ TLuaEngine::StateThreadData::StateThreadData(const std::string& Name, TLuaStateI UtilTable.set_function("RandomIntRange", [this](int64_t min, int64_t max) -> int64_t { return std::uniform_int_distribution(min, max)(mMersenneTwister); }); + UtilTable.set_function("DebugExecutionTime", [this]() -> sol::table { + sol::state_view StateView(mState); + sol::table Result = StateView.create_table(); + auto durs = mProfile.all_average_durations(); + for (const auto& [name, dur] : durs) { + Result[name] = dur; + } + return Result; + }); auto HttpTable = StateView.create_named_table("Http"); HttpTable.set_function("CreateConnection", [this](const std::string& host, uint16_t port) { @@ -984,6 +995,7 @@ void TLuaEngine::StateThreadData::operator()() { std::chrono::milliseconds(500), [&]() -> bool { return !mStateFunctionQueue.empty(); }); if (NotExpired) { + auto ProfStart = prof::now(); auto TheQueuedFunction = std::move(mStateFunctionQueue.front()); mStateFunctionQueue.erase(mStateFunctionQueue.begin()); Lock.unlock(); @@ -1042,6 +1054,9 @@ void TLuaEngine::StateThreadData::operator()() { Result->ErrorMessage = BeamMPFnNotFoundError; // special error kind that we can ignore later Result->MarkAsReady(); } + auto ProfEnd = prof::now(); + auto ProfDuration = prof::duration(ProfStart, ProfEnd); + mProfile.add_sample(FnName, ProfDuration); } } } @@ -1101,7 +1116,7 @@ void TLuaResult::MarkAsReady() { void TLuaResult::WaitUntilReady() { std::unique_lock readyLock(*this->ReadyMutex); // wait if not ready yet - if(!this->Ready) + if (!this->Ready) this->ReadyCondition->wait(readyLock); }