diff options
author | Ivan Komissarov <abbapoh@gmail.com> | 2019-12-23 22:54:11 +0300 |
---|---|---|
committer | Ivan Komissarov <ABBAPOH@gmail.com> | 2020-01-10 13:05:54 +0000 |
commit | e1287e747174b9b2dc7824ad7fddfb8996a18820 (patch) | |
tree | 867fc01f3bbf6bbcddbaaa9a7ce85c0be9a07204 /src | |
parent | 11de0961743ac2a1b50949614765506f79c40bc2 (diff) |
Speedup HostOsInfo::canonicalOSIdentifiers
This piece of code (recursively) allocated so often that it was visible
in the profiler
Reduce time spent in this function from 45ms to 8ms when running 'qbs
resolve qtcreator.qbs'
Change-Id: Ifd7586886499d2e26b7bc67324c1791c54cb251d
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
Diffstat (limited to 'src')
-rw-r--r-- | src/lib/corelib/tools/hostosinfo.h | 15 | ||||
-rw-r--r-- | src/lib/corelib/tools/stlutils.h | 15 |
2 files changed, 18 insertions, 12 deletions
diff --git a/src/lib/corelib/tools/hostosinfo.h b/src/lib/corelib/tools/hostosinfo.h index d7f718c19..42ce3f8cf 100644 --- a/src/lib/corelib/tools/hostosinfo.h +++ b/src/lib/corelib/tools/hostosinfo.h @@ -194,22 +194,21 @@ std::vector<std::string> HostOsInfo::hostOSIdentifiers() std::vector<std::string> HostOsInfo::canonicalOSIdentifiers(const std::string &name) { std::vector<std::string> list { name }; - if (contains(std::vector<std::string> {"ios-simulator"}, name)) + if (contains({"ios-simulator"}, name)) list << canonicalOSIdentifiers("ios"); - if (contains(std::vector<std::string> {"tvos-simulator"}, name)) + if (contains({"tvos-simulator"}, name)) list << canonicalOSIdentifiers("tvos"); - if (contains(std::vector<std::string> {"watchos-simulator"}, name)) + if (contains({"watchos-simulator"}, name)) list << canonicalOSIdentifiers("watchos"); - if (contains(std::vector<std::string> {"macos", "ios", "tvos", "watchos"}, name)) + if (contains({"macos", "ios", "tvos", "watchos"}, name)) list << canonicalOSIdentifiers("darwin"); - if (contains(std::vector<std::string> {"darwin", "freebsd", "netbsd", "openbsd"}, name)) + if (contains({"darwin", "freebsd", "netbsd", "openbsd"}, name)) list << canonicalOSIdentifiers("bsd"); - if (contains(std::vector<std::string> {"android"}, name)) + if (contains({"android"}, name)) list << canonicalOSIdentifiers("linux"); // Note: recognized non-Unix platforms include: windows, haiku, vxworks - if (contains(std::vector<std::string> { - "bsd", "aix", "hpux", "solaris", "linux", "hurd", "qnx", "integrity"}, name)) + if (contains({"bsd", "aix", "hpux", "solaris", "linux", "hurd", "qnx", "integrity"}, name)) list << canonicalOSIdentifiers("unix"); return list; diff --git a/src/lib/corelib/tools/stlutils.h b/src/lib/corelib/tools/stlutils.h index ad00070cf..5c21c0672 100644 --- a/src/lib/corelib/tools/stlutils.h +++ b/src/lib/corelib/tools/stlutils.h @@ -54,11 +54,18 @@ C sorted(const C &container) return result; } -template <class C> -bool contains(const C &container, const typename C::value_type &v) +template <class C, class T> +bool contains(const C &container, const T &v) { - const auto &end = container.cend(); - return std::find(container.cbegin(), end, v) != end; + const auto &end = std::cend(container); + return std::find(std::cbegin(container), end, v) != end; +} + +template <class T, size_t N, class U> +bool contains(const T (&container)[N], const U &v) +{ + const auto &end = std::cend(container); + return std::find(std::cbegin(container), end, v) != end; } template <class C> |