ソースを参照

cmComputeComponentGraph: Move work out of constructor into Compute() method

The computation of Tarjan's algorithm is an expensive operation which
should not be done in the constructor. Move this work into a dedicated
Compute() method, and call this method explicitly.
Kyle Edwards 5 年 前
コミット
bd0d03386b

+ 6 - 2
Source/cmComputeComponentGraph.cxx

@@ -7,6 +7,12 @@
 
 cmComputeComponentGraph::cmComputeComponentGraph(Graph const& input)
   : InputGraph(input)
+{
+}
+
+cmComputeComponentGraph::~cmComputeComponentGraph() = default;
+
+void cmComputeComponentGraph::Compute()
 {
   // Identify components.
   this->Tarjan();
@@ -17,8 +23,6 @@ cmComputeComponentGraph::cmComputeComponentGraph(Graph const& input)
   this->TransferEdges();
 }
 
-cmComputeComponentGraph::~cmComputeComponentGraph() = default;
-
 void cmComputeComponentGraph::Tarjan()
 {
   int n = static_cast<int>(this->InputGraph.size());

+ 3 - 0
Source/cmComputeComponentGraph.h

@@ -31,6 +31,9 @@ public:
   cmComputeComponentGraph(Graph const& input);
   ~cmComputeComponentGraph();
 
+  /** Run the computation.  */
+  void Compute();
+
   /** Get the adjacency list of the component graph.  */
   Graph const& GetComponentGraph() const { return this->ComponentGraph; }
   EdgeList const& GetComponentGraphEdges(int c) const

+ 1 - 0
Source/cmComputeLinkDepends.cxx

@@ -626,6 +626,7 @@ void cmComputeLinkDepends::OrderLinkEntires()
   // constraints disallow it.
   this->CCG =
     cm::make_unique<cmComputeComponentGraph>(this->EntryConstraintGraph);
+  this->CCG->Compute();
 
   // The component graph is guaranteed to be acyclic.  Start a DFS
   // from every entry to compute a topological order for the

+ 1 - 0
Source/cmComputeTargetDepends.cxx

@@ -118,6 +118,7 @@ bool cmComputeTargetDepends::Compute()
 
   // Identify components.
   cmComputeComponentGraph ccg(this->InitialGraph);
+  ccg.Compute();
   if (this->DebugMode) {
     this->DisplayComponents(ccg);
   }