clang으로 더 빠른 코드 완성


108

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 코드 완성 표준에 의해 너무 느리게 보입니다. 속도를 높이는 방법이 있습니까?


8
기꺼이 도와 드리지만 더 구체적인 정보가 필요합니다. 예제 코드는 시작하기에 좋습니다
raph.amiard 2014

1
핑. 이 문제에 진전이 있습니까?
Mehrwolf

4
@Cameron 답변이 오래 지연되어 죄송합니다. 나는 모두 8 개 개의 조합을 시도 CXTranslationUnit_SkipFunctionBodies, CXCodeComplete_IncludeMacros, CXCodeComplete_IncludeCodePatterns내가 작업하고있는 코드베이스에 유의 한 차이를 보이지 않았다. 모두 완료 당 평균 약 4 초입니다. TU의 크기 때문이라고 생각합니다. CXTranslationUnit_PrecompiledPreamble보장하지만이 reparseTU매우 빠릅니다. 그러나,와 CXTranslationUnit_CacheCompletionResults, clang_codeCompleteAt고통스럽게 내 사용-경우에 느립니다.
Pradhan

1
@Mehrwolf Ack. 위의 주석을 참조하십시오.
Pradhan

7
흠, 유감입니다. 대중이 사용할 수있는 번역 단위 (예 : 오픈 소스)에서 완료 속도 저하를 재현 할 수 있습니까? 우리가 이것을 스스로 재현 할 수 있다면 도움이 될 것입니다. 완료는 내부적으로 수행하는 작업이기 때문에 재분석만큼 빠릅니다 (특수 코드 완료 토큰을 주입하고 해당 지점까지 구문 분석).
Cameron

답변:


6

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

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

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

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


대박! 이것은 실제 문제에 이르는 것처럼 들립니다. 이것을 살펴보고 알려줄 것입니다. 감사!
Pradhan

확인! 그것이 당신을 위해 작동하는지 알려주십시오! 질문이 있으시면 언제든지 저에게 물어보세요 !!!!
GutiMac 2015-06-23

4

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

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.