c++ clang llvm code-completion libclang

c++ - Finalización de código más rápida con clang



llvm code-completion (2)

A veces, los retrasos de esta magnitud se deben a tiempos de espera excedidos en los recursos de red (NFS o CIFS comparten en una ruta de búsqueda de archivos o sockets). Intente controlar el tiempo que tarda cada llamada del sistema en completar prefijando el proceso de su ejecución con strace -Tf -o trace.out . Mire los números en corchetes angulares en trace.out para la llamada al sistema que tarda mucho tiempo en completarse.

También puede controlar el tiempo que transcurre entre las llamadas al sistema para ver qué procesamiento de un archivo tarda demasiado en completarse. Para hacer esto, prefija el proceso de su ejecución con strace -rf -o trace.out . Mire el número antes de cada llamada al sistema para buscar largos intervalos de llamadas al sistema. Vaya hacia atrás desde ese punto en busca de llamadas open para ver cuál fue el archivo que se estaba procesando.

Si esto no ayuda, puede profile su proceso para ver dónde pasa la mayor parte de su tiempo.

Estoy investigando posibles aceleraciones de finalización de código mientras uso el mecanismo de terminación de código de clang. El flujo que se describe a continuación es lo que encontré en rtags , por Anders Bakken.

Las unidades de traducción son analizadas por un daemon que monitorea los archivos para ver los cambios. Esto se realiza mediante la llamada clang_parseTranslationUnit y las funciones relacionadas ( reparse* , dispose* ). Cuando el usuario solicita una finalización en una línea y columna determinada en un archivo fuente, el daemon pasa la unidad de traducción almacenada en caché para la última versión guardada del archivo fuente y el archivo fuente actual a clang_codeCompleteAt . ( Clang CodeComplete docs ).

Los indicadores pasados ​​a clang_parseTranslationUnit (de CompletionThread :: process, línea 271 ) son CXTranslationUnit_PrecompiledPreamble|CXTranslationUnit_CacheCompletionResults|CXTranslationUnit_SkipFunctionBodes . Las banderas pasadas a clang_codeCompleteAt (de CompletionThread :: process, línea 305 ) son CXCodeComplete_IncludeMacros|CXCodeComplete_IncludeCodePatterns .

La llamada a clang_codeCompleteAt es muy lenta: la finalización tarda entre 3 y 5 segundos, incluso en los casos en que la ubicación de finalización es un código de acceso de miembro legítimo, un subconjunto del caso de uso previsto mencionado en la documentación de clang_codeCompleteAt . Esto parece demasiado lento según los estándares de finalización de código IDE. ¿Hay alguna manera de acelerar esto?


El problema que tiene clang_parseTranslationUnit es que el preámbulo precompilado no se reutiliza la segunda vez que se denomina terminación de código. Calcular el preámbulo de precompilación lleva más del 90% de estos tiempos, por lo que debe permitir que el preámbulo precompilado se reutilice lo antes posible.

Por defecto, se reutiliza la tercera vez que se llama a la unidad de traducción parse / reparse.

Eche un vistazo a esta variable ''PreambleRebuildCounter'' en ASTUnit.cpp.

Otro problema es que este preámbulo se guarda en un archivo temporal. Puede mantener el preámbulo precompilado en la memoria en lugar de un archivo temporal. Sería más rápido. :)