From 7a8f5da1706114f992533981584dd8ef998fce26 Mon Sep 17 00:00:00 2001 From: Oliver Hamlet Date: Mon, 19 Dec 2022 16:33:38 +0000 Subject: [PATCH] Check plugin validity in parallel This is about 30% faster. --- src/api/game/game.cpp | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/api/game/game.cpp b/src/api/game/game.cpp index d52a4fa2..367480b7 100644 --- a/src/api/game/game.cpp +++ b/src/api/game/game.cpp @@ -93,9 +93,23 @@ void Game::LoadPlugins(const std::vector& plugins, bool loadHeadersOnly) { const auto logger = getLogger(); - for (const auto& plugin : plugins) { - if (!IsValidPlugin(plugin)) - throw std::invalid_argument("\"" + plugin + "\" is not a valid plugin"); + // First validate the plugins (the validity check is done in parallel because + // it's relatively slow). + const auto invalidPluginIt = + std::find_if(std::execution::par_unseq, + plugins.cbegin(), + plugins.cend(), + [this](const std::string& pluginName) { + try { + return !IsValidPlugin(pluginName); + } catch (...) { + return true; + } + }); + + if (invalidPluginIt != plugins.end()) { + throw std::invalid_argument("\"" + *invalidPluginIt + + "\" is not a valid plugin"); } // Clear the existing plugin and archive caches.