# UNDF: UNDF-2026-000000884 --- a/pcsx2/Patch.cpp +++ b/pcsx2/Patch.cpp @@ -583,6 +583,8 @@ void Patch::ReloadEnabledLists() { + // Convert lookup targets to sets for O(1) membership testing instead of + // O(N) linear scans on std::vector, eliminating four O(N^2) loops below. const std::vector prev_enabled_cheats = std::move(s_enabled_cheats); if (EmuConfig.EnableCheats && !Achievements::IsHardcoreModeActive()) s_enabled_cheats = Host::GetStringListSetting(CHEATS_CONFIG_SECTION, PATCH_ENABLE_CONFIG_KEY); @@ -591,6 +593,10 @@ const std::vector prev_enabled_patches = std::exchange(s_enabled_patches, Host::GetStringListSetting(PATCHES_CONFIG_SECTION, PATCH_ENABLE_CONFIG_KEY)); const std::vector disabled_patches = Host::GetStringListSetting(PATCHES_CONFIG_SECTION, PATCH_DISABLE_CONFIG_KEY); + const std::unordered_set disabled_patches_set(disabled_patches.begin(), disabled_patches.end()); + const std::unordered_set prev_enabled_cheats_set(prev_enabled_cheats.begin(), prev_enabled_cheats.end()); + const std::unordered_set prev_enabled_patches_set(prev_enabled_patches.begin(), prev_enabled_patches.end()); + // Name based matching for widescreen/NI settings. if (EmuConfig.EnableWideScreenPatches) @@ -612,7 +618,7 @@ for (auto it = s_enabled_patches.begin(); it != s_enabled_patches.end();) { - if (std::find(disabled_patches.begin(), disabled_patches.end(), *it) != disabled_patches.end()) + if (disabled_patches_set.count(*it)) { it = s_enabled_patches.erase(it); } @@ -626,13 +632,13 @@ s_just_enabled_patches.clear(); for (const auto& p : s_enabled_cheats) { - if (std::find(prev_enabled_cheats.begin(), prev_enabled_cheats.end(), p) == prev_enabled_cheats.end()) + if (!prev_enabled_cheats_set.count(p)) { s_just_enabled_cheats.emplace_back(p); } } for (const auto& p : s_enabled_patches) { - if (std::find(prev_enabled_patches.begin(), prev_enabled_patches.end(), p) == prev_enabled_patches.end()) + if (!prev_enabled_patches_set.count(p)) { s_just_enabled_patches.emplace_back(p); } @@ -644,10 +650,11 @@ u32 Patch::EnablePatches(const std::vector* patches, const std::vector& enable_list, const std::vector* enable_immediately_list) { + const std::unordered_set enable_set(enable_list.begin(), enable_list.end()); u32 count = 0; for (const PatchGroup& p : *patches) { // For compatibility, we auto enable anything that's not labelled. // Also for gamedb patches. - if (!p.name.empty() && std::find(enable_list.begin(), enable_list.end(), p.name) == enable_list.end()) + if (!p.name.empty() && !enable_set.count(p.name)) continue;