diff options
author | Frank Winklmeier <frank.winklmeier@cern.ch> | 2018-02-13 17:18:50 (GMT) |
---|---|---|
committer | Frank Winklmeier <frank.winklmeier@cern.ch> | 2018-02-23 16:06:28 (GMT) |
commit | 2d1e5adaeb5827ebdd3111388f2fcda98656b8ac (patch) | |
tree | d2f8401f418f57b14dcaff562e2cf2273abec725 /Source | |
parent | a08ede979bd0c57906c8ebf4120192f8202ce0d8 (diff) | |
download | CMake-2d1e5adaeb5827ebdd3111388f2fcda98656b8ac.zip CMake-2d1e5adaeb5827ebdd3111388f2fcda98656b8ac.tar.gz CMake-2d1e5adaeb5827ebdd3111388f2fcda98656b8ac.tar.bz2 |
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().
Diffstat (limited to 'Source')
-rw-r--r-- | Source/cmMakefile.cxx | 12 | ||||
-rw-r--r-- | Source/cmMakefile.h | 3 |
2 files changed, 15 insertions, 0 deletions
diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx index 82c6e81..47d75af 100644 --- a/Source/cmMakefile.cxx +++ b/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; } diff --git a/Source/cmMakefile.h b/Source/cmMakefile.h index 5a30790..95ba53a 100644 --- a/Source/cmMakefile.h +++ b/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; |