From a7bfc5ec925c0ac1325d4260dc4c2f6db2493857 Mon Sep 17 00:00:00 2001 From: Xackery Date: Mon, 15 Apr 2024 04:32:27 -0700 Subject: [PATCH] [Performance] Change skill_cap from vector to map (#4252) * Change skill_cap from vector to map * Fix missed level check * Integer based key * Paren --------- Co-authored-by: Akkadius --- common/skill_caps.cpp | 26 ++++++++++---------------- common/skill_caps.h | 2 +- 2 files changed, 11 insertions(+), 17 deletions(-) diff --git a/common/skill_caps.cpp b/common/skill_caps.cpp index dee19773e..4be33b053 100644 --- a/common/skill_caps.cpp +++ b/common/skill_caps.cpp @@ -13,16 +13,11 @@ SkillCapsRepository::SkillCaps SkillCaps::GetSkillCap(uint8 class_id, EQ::skills return SkillCapsRepository::NewEntity(); } - for (const auto &e: m_skill_caps) { - if ( - e.class_id == class_id && - e.level == level && - static_cast(e.skill_id) == skill_id - ) { - return e; - } + uint64_t key = (class_id * 1000000) + (level * 1000) + static_cast(skill_id); + auto pos = m_skill_caps.find(key); + if (pos != m_skill_caps.end()) { + return pos->second; } - return SkillCapsRepository::NewEntity(); } @@ -46,11 +41,9 @@ uint8 SkillCaps::GetTrainLevel(uint8 class_id, EQ::skills::SkillType skill_id, u for (const auto &e: m_skill_caps) { for (uint8 current_level = 1; current_level <= max_level; current_level++) { - if ( - e.class_id == class_id && - static_cast(e.skill_id) == skill_id && - e.level == current_level - ) { + uint64_t key = (class_id * 1000000) + (level * 1000) + static_cast(skill_id); + auto pos = m_skill_caps.find(key); + if (pos != m_skill_caps.end()) { return current_level; } } @@ -63,7 +56,7 @@ void SkillCaps::LoadSkillCaps() { const auto &l = SkillCapsRepository::All(*m_content_database); - m_skill_caps.reserve(l.size()); + m_skill_caps.clear(); for (const auto &e: l) { if ( @@ -74,7 +67,8 @@ void SkillCaps::LoadSkillCaps() continue; } - m_skill_caps.emplace_back(e); + uint64_t key = (e.class_id * 1000000) + (e.level * 1000) + e.skill_id; + m_skill_caps[key] = e; } LogInfo( diff --git a/common/skill_caps.h b/common/skill_caps.h index 1e424d466..e7936c2be 100644 --- a/common/skill_caps.h +++ b/common/skill_caps.h @@ -17,7 +17,7 @@ public: SkillCaps *SetContentDatabase(Database *db); private: Database *m_content_database{}; - std::vector m_skill_caps = {}; + std::map m_skill_caps = {}; }; extern SkillCaps skill_caps;