61 lines
2.7 KiB
Diff
61 lines
2.7 KiB
Diff
# 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<std::string> 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<std::string> prev_enabled_patches = std::exchange(s_enabled_patches, Host::GetStringListSetting(PATCHES_CONFIG_SECTION, PATCH_ENABLE_CONFIG_KEY));
|
|
const std::vector<std::string> disabled_patches = Host::GetStringListSetting(PATCHES_CONFIG_SECTION, PATCH_DISABLE_CONFIG_KEY);
|
|
+ const std::unordered_set<std::string> disabled_patches_set(disabled_patches.begin(), disabled_patches.end());
|
|
+ const std::unordered_set<std::string> prev_enabled_cheats_set(prev_enabled_cheats.begin(), prev_enabled_cheats.end());
|
|
+ const std::unordered_set<std::string> 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<PatchGroup>* patches, const std::vector<std::string>& enable_list, const std::vector<std::string>* enable_immediately_list)
|
|
{
|
|
+ const std::unordered_set<std::string> 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;
|