<br><br><div class="gmail_quote">On Sun, Dec 30, 2012 at 8:45 PM, Dmitri Gribenko <span dir="ltr"><<a href="mailto:gribozavr@gmail.com" target="_blank">gribozavr@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Author: gribozavr<br>
Date: Sun Dec 30 13:45:46 2012<br>
New Revision: 171262<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=171262&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=171262&view=rev</a><br>
Log:<br>
Comment lexing: replace manual comparison with StringRef::find_first_of<br>
<br>
This gives an about 1.8% improvement on Clang bootstrap with -Wdocumentation<br>
<br>
Modified:<br>
    cfe/trunk/lib/AST/CommentLexer.cpp<br>
<br>
Modified: cfe/trunk/lib/AST/CommentLexer.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/CommentLexer.cpp?rev=171262&r1=171261&r2=171262&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/CommentLexer.cpp?rev=171262&r1=171261&r2=171262&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/AST/CommentLexer.cpp (original)<br>
+++ cfe/trunk/lib/AST/CommentLexer.cpp Sun Dec 30 13:45:46 2012<br>
@@ -415,15 +415,12 @@<br>
         return;<br>
<br>
       default: {<br>
-        while (true) {<br>
-          TokenPtr++;<br>
-          if (TokenPtr == CommentEnd)<br>
-            break;<br>
-          const char C = *TokenPtr;<br>
-          if(C == '\n' || C == '\r' ||<br>
-             C == '\\' || C == '@' || C == '&' || C == '<')<br>
-            break;<br>
-        }<br>
+        size_t End = StringRef(TokenPtr, CommentEnd - TokenPtr).<br>
+                         find_first_of("\n\r\\@&<");<br>
+        if (End != StringRef::npos)<br>
+          TokenPtr += End;<br>
+        else<br>
+          TokenPtr = CommentEnd;<br>
         formTextToken(T, TokenPtr);<br>
         return;<br>
       }<br>
<br></blockquote><div><br>Interesting! I just had a look at the implementation of "find_first_of" and realized it built an array of bits (thanks to bitset) so that it had a O(nb chars + len string) complexity.<br>
<br>This table implementation seems very much akin to what a compiler would generate for a switch though, and thus I wonder whether the compiler could optimize a manual for loop with a switch even better; notably because the set of characters to look for is known at compile time.<br>
<br>Did you tested this approach ?<br><br>-- Matthieu<br></div></div>