IT박스

clang으로 더 빠른 코드 완성

itboxs 2020. 8. 6. 08:05
반응형

clang으로 더 빠른 코드 완성


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

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

clang_parseTranslationUnit( CompletionThread :: process에서 271 행으로 ) 전달 된 플래그 CXTranslationUnit_PrecompiledPreamble|CXTranslationUnit_CacheCompletionResults|CXTranslationUnit_SkipFunctionBodes입니다. clang_codeCompleteAt( CompletionThread :: process에서 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하여 어떤 파일이 처리되고 있는지 확인 하기 위해 호출을 찾습니다 .

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

참고 URL : https://stackoverflow.com/questions/26989374/faster-code-completion-with-clang

반응형