clang으로 더 빠른 코드 완성 속도 향상을

clang의 코드 완성 메커니즘을 사용하는 동안 잠재적 인 코드 완성 속도 향상을 조사하고 있습니다. 아래에 설명 된 흐름은 Anders Bakken의 rtags 에서 찾은 것입니다 .

변환 단위는 변경 사항을 모니터링하는 데몬 파일에 의해 구문 분석됩니다. 이것은 호출 clang_parseTranslationUnit및 관련 함수 ( reparse*, dispose*)에 의해 수행됩니다 . 사용자가 소스 파일의 지정된 행과 열에서 완료를 요청하면 데몬은 마지막으로 저장된 소스 파일 버전과 현재 소스 파일에 대해 캐시 된 변환 단위를 clang_codeCompleteAt. ( Clang CodeComplete 문서 ).

clang_parseTranslationUnit( CompletionThread :: process, 271 행 에서) 전달 된 플래그 는 CXTranslationUnit_PrecompiledPreamble|CXTranslationUnit_CacheCompletionResults|CXTranslationUnit_SkipFunctionBodes. clang_codeCompleteAt( CompletionThread :: process, line 305에서 ) 전달 된 플래그 는 CXCodeComplete_IncludeMacros|CXCodeComplete_IncludeCodePatterns.

에 대한 호출 clang_codeCompleteAt은 매우 느립니다. 완료 위치가의 문서에 언급 된 의도 된 사용 사례의 하위 집합 인 합법적 인 구성원 액세스 코드 인 경우에도 완료하는 데 약 3-5 초가 걸립니다 clang_codeCompleteAt. 이것은 IDE 코드 완성 표준에 의해 너무 느리게 보입니다. 속도를 높이는 방법이 있습니까?



답변

clang_parseTranslationUnit의 문제는 코드 완성이라고하는 두 번째로 미리 컴파일 된 프리앰블이 재사용되지 않는다는 것입니다. 프리 컴파일 프리앰블을 계산하는 데이 시간의 90 % 이상이 걸리므로 가능한 한 빨리 프리 컴파일 된 프리앰블이 재사용되도록해야합니다.

기본적으로 번역 단위를 구문 분석 / 재분석하기 위해 호출되는 세 번째 시간에 재사용됩니다.

ASTUnit.cpp에서이 변수 ‘PreambleRebuildCounter’를 살펴보십시오.

다른 문제는이 프리앰블이 임시 파일에 저장된다는 것입니다. 미리 컴파일 된 프리앰블을 임시 파일 대신 메모리에 보관할 수 있습니다. 더 빠를 것입니다. 🙂


답변

때때로이 정도의 지연은 네트워크 리소스 (파일 검색 경로 또는 소켓의 NFS 또는 CIFS 공유)의 시간 초과로 인해 발생합니다. 실행 프로세스 앞에를 붙여 각 시스템 호출이 완료되는 데 걸리는 시간을 모니터링하십시오 strace -Tf -o trace.out. trace.out완료하는 데 시간이 오래 걸리는 시스템 호출은 꺾쇠 괄호 안의 숫자 를 확인하십시오.

또한 시스템 호출 사이 의 시간을 모니터하여 완료하는 데 너무 오래 걸리는 파일 처리를 확인할 수 있습니다 . 이렇게하려면 실행 프로세스에 strace -rf -o trace.out. 긴 시스템 호출 간격을 찾으려면 각 시스템 호출 전에 번호를 확인하십시오. 그 지점에서 뒤로 이동 open하여 처리중인 파일을 확인 하기 위해 호출을 찾습니다 .

그래도 도움이되지 않으면 프로세스를 프로파일 링 하여 대부분의 시간을 소비하는 위치를 확인할 수 있습니다 .