The problem that clang_parseTranslationUnit has is that precompiled preamble is not reused the second time that is called code completion. Calculate the precompile preamble takes more than the 90% of these time so you should allow that the precompiled preamble was reused as soon as posible.
By default it is reused the third time that is called to parse/reparse translation unit.
Take a look of this variable ‘PreambleRebuildCounter’ in ASTUnit.cpp.
Other problem is that this preamble is saved in a temporary file. You can keep the precompiled preamble in memory instead of a temporary file. It would be faster. 🙂