r220682 - Speed up clang-tidy when profiling in on.

Samuel Benzaquen sbenza at google.com
Mon Oct 27 08:22:59 PDT 2014


Author: sbenza
Date: Mon Oct 27 10:22:59 2014
New Revision: 220682

URL: http://llvm.org/viewvc/llvm-project?rev=220682&view=rev
Log:
Speed up clang-tidy when profiling in on.

Summary:
Speed up clang-tidy when profiling in on.
It makes profiling runs twice as fast by reusing the time samples between the
different actions.
It also joins together the sampling of different matchers of the same check.

Reviewers: alexfh

Subscribers: klimek, cfe-commits

Differential Revision: http://reviews.llvm.org/D5972

Modified:
    cfe/trunk/lib/ASTMatchers/ASTMatchFinder.cpp

Modified: cfe/trunk/lib/ASTMatchers/ASTMatchFinder.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/ASTMatchers/ASTMatchFinder.cpp?rev=220682&r1=220681&r2=220682&view=diff
==============================================================================
--- cfe/trunk/lib/ASTMatchers/ASTMatchFinder.cpp (original)
+++ cfe/trunk/lib/ASTMatchers/ASTMatchFinder.cpp Mon Oct 27 10:22:59 2014
@@ -307,18 +307,20 @@ public:
 
   void onStartOfTranslationUnit() {
     const bool EnableCheckProfiling = Options.CheckProfiling.hasValue();
+    TimeBucketRegion Timer;
     for (MatchCallback *MC : Matchers->AllCallbacks) {
-      TimeRegion Timer(EnableCheckProfiling ? &TimeByBucket[MC->getID()]
-                                            : nullptr);
+      if (EnableCheckProfiling)
+        Timer.setBucket(&TimeByBucket[MC->getID()]);
       MC->onStartOfTranslationUnit();
     }
   }
 
   void onEndOfTranslationUnit() {
     const bool EnableCheckProfiling = Options.CheckProfiling.hasValue();
+    TimeBucketRegion Timer;
     for (MatchCallback *MC : Matchers->AllCallbacks) {
-      TimeRegion Timer(EnableCheckProfiling ? &TimeByBucket[MC->getID()]
-                                            : nullptr);
+      if (EnableCheckProfiling)
+        Timer.setBucket(&TimeByBucket[MC->getID()]);
       MC->onEndOfTranslationUnit();
     }
   }
@@ -489,19 +491,32 @@ public:
   bool shouldUseDataRecursionFor(clang::Stmt *S) const { return false; }
 
 private:
-  class TimeRegion {
+  class TimeBucketRegion {
   public:
-    TimeRegion(llvm::TimeRecord *Record) : Record(Record) {
-      if (Record)
-        *Record -= llvm::TimeRecord::getCurrentTime(true);
-    }
-    ~TimeRegion() {
-      if (Record)
-        *Record += llvm::TimeRecord::getCurrentTime(false);
+    TimeBucketRegion() : Bucket(nullptr) {}
+    ~TimeBucketRegion() { setBucket(nullptr); }
+
+    /// \brief Start timing for \p NewBucket.
+    ///
+    /// If there was a bucket already set, it will finish the timing for that
+    /// other bucket.
+    /// \p NewBucket will be timed until the next call to \c setBucket() or
+    /// until the \c TimeBucketRegion is destroyed.
+    /// If \p NewBucket is the same as the currently timed bucket, this call
+    /// does nothing.
+    void setBucket(llvm::TimeRecord *NewBucket) {
+      if (Bucket != NewBucket) {
+        auto Now = llvm::TimeRecord::getCurrentTime(true);
+        if (Bucket)
+          *Bucket += Now;
+        if (NewBucket)
+          *NewBucket -= Now;
+        Bucket = NewBucket;
+      }
     }
 
   private:
-    llvm::TimeRecord *Record;
+    llvm::TimeRecord *Bucket;
   };
 
   /// \brief Runs all the \p Matchers on \p Node.
@@ -510,9 +525,10 @@ private:
   template <typename T, typename MC>
   void matchImpl(const T &Node, const MC &Matchers) {
     const bool EnableCheckProfiling = Options.CheckProfiling.hasValue();
+    TimeBucketRegion Timer;
     for (const auto &MP : Matchers) {
-      TimeRegion Timer(EnableCheckProfiling ? &TimeByBucket[MP.second->getID()]
-                                            : nullptr);
+      if (EnableCheckProfiling)
+        Timer.setBucket(&TimeByBucket[MP.second->getID()]);
       BoundNodesTreeBuilder Builder;
       if (MP.first.matches(Node, this, &Builder)) {
         MatchVisitor Visitor(ActiveASTContext, MP.second);





More information about the cfe-commits mailing list