瀏覽代碼

Merge topic 'fix-target-lookup-performance-regression'

9b7d5871 Improve internal generator target structure lookup
6cbf6a51 Fix internal target lookup performance regression
Brad King 9 年之前
父節點
當前提交
a887c7f1fd
共有 4 個文件被更改,包括 47 次插入62 次删除
  1. 20 61
      Source/cmGlobalGenerator.cxx
  2. 23 1
      Source/cmGlobalGenerator.h
  3. 2 0
      Source/cmLocalGenerator.cxx
  4. 2 0
      Source/cmMakefile.cxx

+ 20 - 61
Source/cmGlobalGenerator.cxx

@@ -1649,6 +1649,8 @@ void cmGlobalGenerator::ClearGeneratorMembers()
 
   this->ExportSets.clear();
   this->TargetDependencies.clear();
+  this->TargetSearchIndex.clear();
+  this->GeneratorTargetSearchIndex.clear();
   this->ProjectMap.clear();
   this->RuleHashes.clear();
   this->DirectoryContentMap.clear();
@@ -2177,75 +2179,40 @@ bool cmGlobalGenerator::IsAlias(const std::string& name) const
   return this->AliasTargets.find(name) != this->AliasTargets.end();
 }
 
-cmTarget* cmGlobalGenerator::FindTargetImpl(std::string const& name) const
+void cmGlobalGenerator::IndexTarget(cmTarget* t)
 {
-  for (unsigned int i = 0; i < this->Makefiles.size(); ++i)
+  if (!t->IsImported() || t->IsImportedGloballyVisible())
     {
-    cmTargets& tgts = this->Makefiles[i]->GetTargets();
-    for (cmTargets::iterator it = tgts.begin(); it != tgts.end(); ++it)
-      {
-      if (it->second.GetName() == name)
-        {
-        return &it->second;
-        }
-      }
+    this->TargetSearchIndex[t->GetName()] = t;
     }
-  return 0;
 }
 
-cmGeneratorTarget*
-cmGlobalGenerator::FindGeneratorTargetImpl(std::string const& name) const
+void cmGlobalGenerator::IndexGeneratorTarget(cmGeneratorTarget* gt)
 {
-  for (unsigned int i = 0; i < this->LocalGenerators.size(); ++i)
+  if (!gt->IsImported() || gt->IsImportedGloballyVisible())
     {
-    const std::vector<cmGeneratorTarget*>& tgts =
-        this->LocalGenerators[i]->GetGeneratorTargets();
-    for (std::vector<cmGeneratorTarget*>::const_iterator it = tgts.begin();
-         it != tgts.end(); ++it)
-      {
-      if ((*it)->GetName() == name)
-        {
-        return *it;
-        }
-      }
+    this->GeneratorTargetSearchIndex[gt->GetName()] = gt;
     }
-  return 0;
 }
 
-cmTarget*
-cmGlobalGenerator::FindImportedTargetImpl(std::string const& name) const
+cmTarget* cmGlobalGenerator::FindTargetImpl(std::string const& name) const
 {
-  for (unsigned int i = 0; i < this->Makefiles.size(); ++i)
+  TargetMap::const_iterator i = this->TargetSearchIndex.find(name);
+  if (i != this->TargetSearchIndex.end())
     {
-    const std::vector<cmTarget*>& tgts =
-        this->Makefiles[i]->GetOwnedImportedTargets();
-    for (std::vector<cmTarget*>::const_iterator it = tgts.begin();
-         it != tgts.end(); ++it)
-      {
-      if ((*it)->GetName() == name && (*it)->IsImportedGloballyVisible())
-        {
-        return *it;
-        }
-      }
+    return i->second;
     }
   return 0;
 }
 
-cmGeneratorTarget* cmGlobalGenerator::FindImportedGeneratorTargetImpl(
-    std::string const& name) const
+cmGeneratorTarget*
+cmGlobalGenerator::FindGeneratorTargetImpl(std::string const& name) const
 {
-  for (unsigned int i = 0; i < this->LocalGenerators.size(); ++i)
+  GeneratorTargetMap::const_iterator i =
+    this->GeneratorTargetSearchIndex.find(name);
+  if (i != this->GeneratorTargetSearchIndex.end())
     {
-    const std::vector<cmGeneratorTarget*>& tgts =
-        this->LocalGenerators[i]->GetImportedGeneratorTargets();
-    for (std::vector<cmGeneratorTarget*>::const_iterator it = tgts.begin();
-         it != tgts.end(); ++it)
-      {
-      if ((*it)->IsImportedGloballyVisible() && (*it)->GetName() == name)
-        {
-        return *it;
-        }
-      }
+    return i->second;
     }
   return 0;
 }
@@ -2264,11 +2231,7 @@ cmGlobalGenerator::FindTarget(const std::string& name,
       return this->FindTargetImpl(ai->second);
       }
     }
-  if (cmTarget* tgt = this->FindTargetImpl(name))
-    {
-    return tgt;
-    }
-  return this->FindImportedTargetImpl(name);
+  return this->FindTargetImpl(name);
 }
 
 cmGeneratorTarget*
@@ -2280,11 +2243,7 @@ cmGlobalGenerator::FindGeneratorTarget(const std::string& name) const
     {
     return this->FindGeneratorTargetImpl(ai->second);
     }
-  if (cmGeneratorTarget* tgt = this->FindGeneratorTargetImpl(name))
-    {
-    return tgt;
-    }
-  return this->FindImportedGeneratorTargetImpl(name);
+  return this->FindGeneratorTargetImpl(name);
 }
 
 //----------------------------------------------------------------------------

+ 23 - 1
Source/cmGlobalGenerator.h

@@ -278,6 +278,9 @@ public:
   std::set<std::string> const& GetDirectoryContent(std::string const& dir,
                                                    bool needDisk = true);
 
+  void IndexTarget(cmTarget* t);
+  void IndexGeneratorTarget(cmGeneratorTarget* gt);
+
   static bool IsReservedTarget(std::string const& name);
 
   virtual const char* GetAllTargetName()         const { return "ALL_BUILD"; }
@@ -420,7 +423,6 @@ protected:
   std::map<std::string, std::string> AliasTargets;
 
   cmTarget* FindTargetImpl(std::string const& name) const;
-  cmTarget* FindImportedTargetImpl(std::string const& name) const;
 
   cmGeneratorTarget* FindGeneratorTargetImpl(std::string const& name) const;
   cmGeneratorTarget*
@@ -430,6 +432,26 @@ protected:
   virtual bool UseFolderProperty();
 
 private:
+
+#if defined(CMAKE_BUILD_WITH_CMAKE)
+# ifdef CMake_HAVE_CXX11_UNORDERED_MAP
+  typedef std::unordered_map<std::string, cmTarget*> TargetMap;
+  typedef std::unordered_map<std::string, cmGeneratorTarget*>
+    GeneratorTargetMap;
+# else
+  typedef cmsys::hash_map<std::string, cmTarget*> TargetMap;
+  typedef cmsys::hash_map<std::string, cmGeneratorTarget*> GeneratorTargetMap;
+# endif
+#else
+  typedef std::map<std::string,cmTarget *> TargetMap;
+  typedef std::map<std::string,cmGeneratorTarget *> GeneratorTargetMap;
+#endif
+  // Map efficiently from target name to cmTarget instance.
+  // Do not use this structure for looping over all targets.
+  // It contains both normal and globally visible imported targets.
+  TargetMap TargetSearchIndex;
+  GeneratorTargetMap GeneratorTargetSearchIndex;
+
   cmMakefile* TryCompileOuterMakefile;
   // If you add a new map here, make sure it is copied
   // in EnableLanguagesFromGenerator

+ 2 - 0
Source/cmLocalGenerator.cxx

@@ -455,11 +455,13 @@ void cmLocalGenerator::GenerateInstallRules()
 void cmLocalGenerator::AddGeneratorTarget(cmGeneratorTarget* gt)
 {
   this->GeneratorTargets.push_back(gt);
+  this->GlobalGenerator->IndexGeneratorTarget(gt);
 }
 
 void cmLocalGenerator::AddImportedGeneratorTarget(cmGeneratorTarget* gt)
 {
   this->ImportedGeneratorTargets.push_back(gt);
+  this->GlobalGenerator->IndexGeneratorTarget(gt);
 }
 
 void cmLocalGenerator::AddOwnedImportedGeneratorTarget(cmGeneratorTarget* gt)

+ 2 - 0
Source/cmMakefile.cxx

@@ -2128,6 +2128,7 @@ cmMakefile::AddNewTarget(cmState::TargetType type, const std::string& name)
   cmTarget& target = it->second;
   target.SetType(type, name);
   target.SetMakefile(this);
+  this->GetGlobalGenerator()->IndexTarget(&it->second);
   return &it->second;
 }
 
@@ -4218,6 +4219,7 @@ cmMakefile::AddImportedTarget(const std::string& name,
 
   // Add to the set of available imported targets.
   this->ImportedTargets[name] = target.get();
+  this->GetGlobalGenerator()->IndexTarget(target.get());
 
   // Transfer ownership to this cmMakefile object.
   this->ImportedTargetsOwned.push_back(target.get());