alexfh added inline comments.

================
Comment at: clang-tidy/abseil/UpgradeDurationConversionsCheck.cpp:33-36
+              anyOf(hasAncestor(
+                        functionTemplateDecl(HasMatchingDependentDescendant)),
+                    hasAncestor(
+                        classTemplateDecl(HasMatchingDependentDescendant))))
----------------
astrelni wrote:
> alexfh wrote:
> > The hasAncestor and hasDescendant matchers frequently have non-trivial 
> > performance implications. Especially the latter, especially when called on 
> > a large number of nodes with a large number of transitive children (this 
> > obviously depends on the code being analyzed). I don't know how likely is 
> > this to cause problems here (the matcher seems to only be used when the 
> > check is about to issue a diagnostic), but it's always good to be aware of 
> > the possible issues.
> > 
> > Frequently there's a more efficient (and easier to understand) alternative. 
> > For example, instead of trying to evaluate certain conditions while 
> > traversing the code (which may require a large number of lookups into 
> > relatively distant parts of the AST), it's sometimes more efficient to 
> > split the analysis into two or more stages. During the AST traversal (i.e. 
> > when AST matchers run) the check could collect some raw information about 
> > all potentially problematic places in the code and then (for example, in 
> > `onEndOfTranslationUnit`) analyze the collected information together in a 
> > second stage. This works best if there's a way to arrange the data gathered 
> > on the first pass such that the second pass can efficiently look up 
> > necessary information.
> Thanks, gave it a try, what do you think of this?
From a cursory look this should be less likely to be sloooow. In any case, 
makes sense to profile the check on a number of large files (at least against 
other checks, using clang-tidy's -enable-check-profile option).


================
Comment at: clang-tidy/abseil/UpgradeDurationConversionsCheck.cpp:43
+              unless(hasTemplateArgument(0, refersToType(builtinType()))),
+              anyOf(hasName("operator*="), hasName("operator/="))))),
+      this);
----------------
hasAnyName, please. It's more efficient. A few more instances below.


https://reviews.llvm.org/D53830



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to