mirror of
https://github.com/reactos/CMake.git
synced 2025-02-26 23:15:28 +00:00
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().
This commit is contained in:
parent
a08ede979b
commit
2d1e5adaeb
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user