From 3f0d2da60f8d2cabcdb5e4b67af8fea68eb7e0c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-S=C3=A9bastien=20Pelletier?= Date: Tue, 15 Oct 2024 15:25:46 -0400 Subject: [PATCH] Add cache for GetVisualStudioVCToolsCompilerVersion() Before: Was taking 99 secs over 24 threads After: Taking 69 ms over 24 threads: Gain: ~2.5 secs wall clock when generating projects for anvil pipeline --- Sharpmake/ExtensionMethods.cs | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/Sharpmake/ExtensionMethods.cs b/Sharpmake/ExtensionMethods.cs index 675997327..d1de6f2eb 100644 --- a/Sharpmake/ExtensionMethods.cs +++ b/Sharpmake/ExtensionMethods.cs @@ -393,11 +393,18 @@ public static Version GetVisualStudioVCToolsVersion(this DevEnv visualVersion) return version; } + private static ConcurrentDictionary<(DevEnv, Platform), Version> s_visualStudioCompilerVersionCache = new ConcurrentDictionary<(DevEnv, Platform), Version>(); + public static Version GetVisualStudioVCToolsCompilerVersion(this DevEnv visualVersion, Platform platform) { - string clExeFile = Path.Combine(visualVersion.GetVisualStudioBinPath(platform), "cl.exe"); - FileVersionInfo fileVersionInfo = FileVersionInfo.GetVersionInfo(clExeFile); - return new Version(fileVersionInfo.FileMajorPart, fileVersionInfo.FileMinorPart, fileVersionInfo.FileBuildPart, fileVersionInfo.FilePrivatePart); + var cacheKey = (visualVersion, platform); + Version version = s_visualStudioCompilerVersionCache.GetOrAdd(cacheKey, ((DevEnv, Platform) key) => + { + string clExeFile = Path.Combine(visualVersion.GetVisualStudioBinPath(platform), "cl.exe"); + FileVersionInfo fileVersionInfo = FileVersionInfo.GetVersionInfo(clExeFile); + return new Version(fileVersionInfo.FileMajorPart, fileVersionInfo.FileMinorPart, fileVersionInfo.FileBuildPart, fileVersionInfo.FilePrivatePart); + }); + return version; } ///