[cfe-dev] Clang indexing library performance
Alexander Bolodurin
alexander.bolodurin at gmail.com
Sun Oct 2 02:06:30 PDT 2011
On 02/10/2011, at 5:44 AM, Douglas Gregor wrote:
>
> On Oct 1, 2011, at 2:34 AM, Alexander Bolodurin wrote:
>
>> I was playing with libclang-based indexing and clang_complete plugin for Vim.
>> Having found completion responsiveness a bit lacking, I decided to track down whether it's plugin's fault.
>>
>> To put the indexer under stress, I've made up an artificial test with the biggest and baddest C++ headers:
>>
>> ---------------8<---------------
>> #include <boost/asio.hpp>
>> #include <boost/regex.hpp>
>> #include <boost/thread.hpp>
>> #include <boost/spirit.hpp>
>> #include <boost/signals2.hpp>
>> boost::
>> ---------------8<---------------
>>
>> ...and the following minimal test program using Python bindings:
>>
>> ---------------8<---------------
>> from clang import cindex
>>
>> def clock(f):
>> import time
>> def wrapf(*args,**kw):
>> start = time.time()
>> f(*args,**kw)
>> end = time.time()
>> print f.func_name, end - start
>> return wrapf
>>
>> fname='...path to file...'
>> idx=cindex.Index.create()
>>
>> @clock
>> def parse():
>> global tu
>> opts = ['-I/opt/local/include'] # MacPorts Boost path
>> tu=idx.parse(fname,opts)
>>
>> @clock
>> def complete():
>> c = tu.codeComplete(fname,6,8)
>>
>> parse()
>> for i in range(4):
>> complete()
>> ---------------8<---------------
>>
>> This is the timing I get on a Macbook Pro:
>>
>> parse 3.96061992645
>> complete 3.31106615067
>> complete 3.17438578606
>> complete 3.37997102737
>> complete 3.16793084145
>>
>> Each one individually isn't *too* bad, taking under 1s, though still not too responsive, with exception of signals2.hpp taking over 1.5s and, and less exotic thread.hpp taking about 1.2s.
>>
>> So, the questions:
>>
>> Am I misusing the library? Should I try passing some additional flags or anything else?
>
> You want to use the "default editing options" when parsing the translation unit
>
> clang_defaultEditingTranslationUnitOptions()
>
> and then reparse at least once. That will enable the various code-completion optimizations that should bring this time down significantly.
>
>> Or it's just the way it is? What puzzles me is that completion takes time comparable to parsing.
>
> That's because it *is* parsing :)
>
>> I take it headers have to be re-parsed in case the order of inclusion changes, as it may potentially change header contents, but 3s still seems a bit excessive.
>
> Given the volume of code you're parsing, I wouldn't call 3s excessive. On my system, GCC takes 2.7s, Clang normally takes 2.3s, and Clang when parsing for code completion takes 1.6s (it takes some shortcuts).
>
> If you then turn on the optimizations I mentioned above, it goes down to 0.4s. Of course, it could always be better.
>
> - Doug
I have set the appropriate flags and tried re-parsing, but I get nowhere near 0.4s completion time (which would be fantastic, of course).
To be completely clear, I'm using official 2.9 release.
More information about the cfe-dev
mailing list