소스 검색

cmMakefile: Improve performance of GetSource for known files

Store "Known" files separately in KnownFileSearchIndex. This avoids
creating the rather expensive cmSourceFileLocation object for source
files that are already known. For large projects this results in a
factor 3-4 speedup of cmGlobalGenerator::Compute().
Frank Winklmeier 7 년 전
부모
커밋
2d1e5adaeb
2개의 변경된 파일15개의 추가작업 그리고 0개의 파일을 삭제
  1. 12 0
      Source/cmMakefile.cxx
  2. 3 0
      Source/cmMakefile.h

+ 12 - 0
Source/cmMakefile.cxx

@@ -3138,6 +3138,14 @@ void cmMakefile::SetArgcArgv(const std::vector<std::string>& args)
 cmSourceFile* cmMakefile::GetSource(const std::string& sourceName,
                                     cmSourceFileLocationKind kind) const
 {
+  // First check "Known" paths (avoids the creation of cmSourceFileLocation)
+  if (kind == cmSourceFileLocationKind::Known) {
+    auto sfsi = this->KnownFileSearchIndex.find(sourceName);
+    if (sfsi != this->KnownFileSearchIndex.end()) {
+      return sfsi->second;
+    }
+  }
+
   cmSourceFileLocation sfl(this, sourceName, kind);
   auto name = this->GetCMakeInstance()->StripExtension(sfl.GetName());
 #if defined(_WIN32) || defined(__APPLE__)
@@ -3170,6 +3178,10 @@ cmSourceFile* cmMakefile::CreateSource(const std::string& sourceName,
   name = cmSystemTools::LowerCase(name);
 #endif
   this->SourceFileSearchIndex[name].push_back(sf);
+  // for "Known" paths add direct lookup (used for faster lookup in GetSource)
+  if (kind == cmSourceFileLocationKind::Known) {
+    this->KnownFileSearchIndex[sourceName] = sf;
+  }
 
   return sf;
 }

+ 3 - 0
Source/cmMakefile.h

@@ -861,6 +861,9 @@ protected:
   typedef std::unordered_map<std::string, SourceFileVec> SourceFileMap;
   SourceFileMap SourceFileSearchIndex;
 
+  // For "Known" paths we can store a direct filename to cmSourceFile map
+  std::unordered_map<std::string, cmSourceFile*> KnownFileSearchIndex;
+
   // Tests
   std::map<std::string, cmTest*> Tests;