From 73d50ab98b53f77d97b4e3a1cc56b9101db24d93 Mon Sep 17 00:00:00 2001 From: Deukhoofd Date: Sat, 28 Aug 2021 16:05:31 +0200 Subject: [PATCH] Adds logging for library build times --- BuildLibrary.cpp | 99 ++++++++++++++++++++++++++++++++++++++++++++++++ BuildLibrary.hpp | 50 ++---------------------- 2 files changed, 103 insertions(+), 46 deletions(-) create mode 100644 BuildLibrary.cpp diff --git a/BuildLibrary.cpp b/BuildLibrary.cpp new file mode 100644 index 0000000..3f9a226 --- /dev/null +++ b/BuildLibrary.cpp @@ -0,0 +1,99 @@ +#include "BuildLibrary.hpp" +#include + +using namespace PkmnLib::Battling; + +size_t TypeTimeMs; +size_t NaturesTimeMs; +size_t MovesTimeMs; +size_t SpeciesTimeMs; +size_t ItemsTimeMs; +size_t GrowthRateTimeMs; +size_t ScriptsTimeMs; + +void BuildLibrary::LogBuildTimes() { + std::cout << "\tType Library Time: " << TypeTimeMs << "ms" << std::endl; + std::cout << "\tNatures Library Time: " << NaturesTimeMs << "ms" << std::endl; + std::cout << "\tMoves Library Time: " << MovesTimeMs << "ms" << std::endl; + std::cout << "\tSpecies Library Time: " << SpeciesTimeMs << "ms" << std::endl; + std::cout << "\tItems Library Time: " << ItemsTimeMs << "ms" << std::endl; + std::cout << "\tGrowth rates Library Time: " << GrowthRateTimeMs << "ms" << std::endl; + std::cout << "\tScripts Time: " << ScriptsTimeMs << "ms" << std::endl; +} + + +BattleLibrary* BuildLibrary::Build(const std::string& pathString, + std::function onScriptInitialize) { + auto path = std::filesystem::path(pathString); + + std::chrono::steady_clock::time_point begin = std::chrono::steady_clock::now(); + auto* typesLibrary = BuildTypes::Build(path / "Types.csv"); + TypeTimeMs = + std::chrono::duration_cast(std::chrono::steady_clock::now() - begin).count(); + begin = std::chrono::steady_clock::now(); + + auto* natureLibrary = BuildNatures::Build(path / "Natures.csv"); + NaturesTimeMs = + std::chrono::duration_cast(std::chrono::steady_clock::now() - begin).count(); + begin = std::chrono::steady_clock::now(); + + auto* movesLibrary = BuildMoves::Build(path / "Moves.json", typesLibrary); + MovesTimeMs = + std::chrono::duration_cast(std::chrono::steady_clock::now() - begin).count(); + begin = std::chrono::steady_clock::now(); + + auto* speciesLibrary = BuildSpecies::BuildLibrary(path / "Pokemon.json", typesLibrary, movesLibrary); + SpeciesTimeMs = + std::chrono::duration_cast(std::chrono::steady_clock::now() - begin).count(); + begin = std::chrono::steady_clock::now(); + + auto* itemsLibrary = BuildItems::Build(path / "Items.json"); + ItemsTimeMs = + std::chrono::duration_cast(std::chrono::steady_clock::now() - begin).count(); + begin = std::chrono::steady_clock::now(); + + auto* growthRates = GrowthRatesBuilder::Build(path / "GrowthRates.json"); + GrowthRateTimeMs = + std::chrono::duration_cast(std::chrono::steady_clock::now() - begin).count(); + + auto scriptsPath = path / "Scripts"; + + if (typesLibrary == nullptr || speciesLibrary == nullptr || natureLibrary == nullptr || movesLibrary == nullptr || + itemsLibrary == nullptr || growthRates == nullptr) { + return nullptr; + } + + auto settings = new PkmnLib::Library::LibrarySettings(100, 4, 4096); + auto staticLibrary = new PkmnLib::Library::PokemonLibrary(settings, speciesLibrary, movesLibrary, itemsLibrary, + growthRates, typesLibrary, natureLibrary); + + begin = std::chrono::steady_clock::now(); + auto scriptResolver = BattleLibrary::CreateScriptResolver(); + + auto battleLib = new BattleLibrary(staticLibrary, new StatCalculator(), new DamageLibrary(false), + new ExperienceLibrary(), scriptResolver, new MiscLibrary(GetTime)); + + scriptResolver->Initialize(battleLib); + + if (onScriptInitialize) { + onScriptInitialize(scriptResolver); + } + auto asScriptResolver = dynamic_cast(scriptResolver); + + for (const auto& dirEntry : std::filesystem::recursive_directory_iterator(scriptsPath)) { + if (dirEntry.is_directory()) + continue; + if (dirEntry.path().parent_path().stem() == "Interfaces") + continue; + if (dirEntry.path().extension() != ".as") + continue; + std::ifstream in(dirEntry.path()); + std::string contents((std::istreambuf_iterator(in)), std::istreambuf_iterator()); + asScriptResolver->CreateScript(dirEntry.path().c_str(), contents.c_str()); + } + asScriptResolver->FinalizeModule(); + ScriptsTimeMs = + std::chrono::duration_cast(std::chrono::steady_clock::now() - begin).count(); + + return battleLib; +} diff --git a/BuildLibrary.hpp b/BuildLibrary.hpp index c3bc432..ccf30d0 100644 --- a/BuildLibrary.hpp +++ b/BuildLibrary.hpp @@ -14,54 +14,12 @@ class BuildLibrary { static PkmnLib::Library::TimeOfDay GetTime() { return PkmnLib::Library::TimeOfDay::Morning; } public: + + static void LogBuildTimes(); + static PkmnLib::Battling::BattleLibrary* Build(const std::string& pathString, - std::function onScriptInitialize = {}) { - auto path = std::filesystem::path(pathString); - auto* typesLibrary = BuildTypes::Build(path / "Types.csv"); - auto* natureLibrary = BuildNatures::Build(path / "Natures.csv"); - auto* movesLibrary = BuildMoves::Build(path / "Moves.json", typesLibrary); - auto* speciesLibrary = BuildSpecies::BuildLibrary(path / "Pokemon.json", typesLibrary, movesLibrary); - auto* itemsLibrary = BuildItems::Build(path / "Items.json"); - auto* growthRates = GrowthRatesBuilder::Build(path / "GrowthRates.json"); - auto scriptsPath = path / "Scripts"; - - if (typesLibrary == nullptr || speciesLibrary == nullptr || natureLibrary == nullptr || - movesLibrary == nullptr || itemsLibrary == nullptr || growthRates == nullptr) { - return nullptr; - } - - auto settings = new PkmnLib::Library::LibrarySettings(100, 4, 4096); - auto staticLibrary = new PkmnLib::Library::PokemonLibrary(settings, speciesLibrary, movesLibrary, itemsLibrary, - growthRates, typesLibrary, natureLibrary); - - auto scriptResolver = PkmnLib::Battling::BattleLibrary::CreateScriptResolver(); - - auto battleLib = new PkmnLib::Battling::BattleLibrary( - staticLibrary, new PkmnLib::Battling::StatCalculator(), new PkmnLib::Battling::DamageLibrary(false), - new PkmnLib::Battling::ExperienceLibrary(), scriptResolver, new PkmnLib::Battling::MiscLibrary(GetTime)); - - scriptResolver->Initialize(battleLib); - - if (onScriptInitialize) { - onScriptInitialize(scriptResolver); - } - auto asScriptResolver = dynamic_cast(scriptResolver); - - for (const auto& dirEntry : std::filesystem::recursive_directory_iterator(scriptsPath)) { - if (dirEntry.is_directory()) - continue; - if (dirEntry.path().parent_path().stem() == "Interfaces") - continue; - if (dirEntry.path().extension() != ".as") - continue; - std::ifstream in(dirEntry.path()); - std::string contents((std::istreambuf_iterator(in)), std::istreambuf_iterator()); - asScriptResolver->CreateScript(dirEntry.path().c_str(), contents.c_str()); - } - asScriptResolver->FinalizeModule(); - return battleLib; - } + std::function onScriptInitialize = {}); }; #endif // PKMNLIB_AI_BUILDLIBRARY_HPP