เติมโค้ดได้เร็วขึ้นด้วยเสียงดังกริ๊ก


108

ฉันกำลังตรวจสอบการเร่งการเติมโค้ดที่เป็นไปได้ในขณะที่ใช้กลไกการเติมโค้ดของ clang ขั้นตอนที่อธิบายด้านล่างคือสิ่งที่ฉันพบในrtagsโดย Anders Bakken

หน่วยการแปลถูกแยกวิเคราะห์โดยไฟล์การมอนิเตอร์ daemon สำหรับการเปลี่ยนแปลง สิ่งนี้ทำได้โดยเรียกclang_parseTranslationUnitและฟังก์ชันที่เกี่ยวข้อง ( reparse*, dispose*) clang_codeCompleteAtเมื่อผู้ใช้ร้องขอเสร็จสิ้นในเส้นที่กำหนดและคอลัมน์ในแฟ้มแหล่งที่มาที่ภูตผ่านการแปลหน่วยที่เก็บไว้สำหรับรุ่นที่บันทึกไว้ล่าสุดของแฟ้มแหล่งที่มาและแฟ้มแหล่งที่มาปัจจุบัน ( เอกสาร Clang CodeComplete )

ธงที่ส่งผ่านไปclang_parseTranslationUnit(จากCompletionThread :: กระบวนการสาย 271 ) CXTranslationUnit_PrecompiledPreamble|CXTranslationUnit_CacheCompletionResults|CXTranslationUnit_SkipFunctionBodesเป็น ธงที่ส่งผ่านไปclang_codeCompleteAt(จากCompletionThread :: กระบวนการสาย 305 ) CXCodeComplete_IncludeMacros|CXCodeComplete_IncludeCodePatternsเป็น

เรียกร้องให้clang_codeCompleteAtช้ามาก - มันจะใช้เวลาประมาณ 3-5 clang_codeCompleteAtวินาทีเพื่อให้ได้เสร็จสิ้นแม้ในกรณีที่สถานที่ตั้งเสร็จสิ้นเป็นรหัสการเข้าถึงสมาชิกที่ถูกต้องเป็นส่วนหนึ่งของกรณีการใช้งานตั้งใจที่กล่าวถึงในเอกสารของ ดูเหมือนว่าวิธีนี้จะช้าเกินไปตามมาตรฐานการเติมรหัส IDE มีวิธีเร่งความเร็วนี้หรือไม่?


8
เรายินดีที่จะช่วยเหลือคุณ แต่เราต้องการข้อมูลที่เฉพาะเจาะจงมากขึ้น ตัวอย่างรหัสจะดีสำหรับการเริ่มต้น
raph.amiard

1
ปิง มีความคืบหน้าเกี่ยวกับปัญหานี้หรือไม่?
Mehrwolf

4
@ คาเมรอนขออภัยในความล่าช้าในการติดต่อกลับ ฉันพยายามทั้งหมด 8 ชุดCXTranslationUnit_SkipFunctionBodies, CXCodeComplete_IncludeMacros, CXCodeComplete_IncludeCodePatternsและไม่เห็นความแตกต่างอย่างมีนัยสำคัญใน codebase ที่ผมกำลังทำงานร่วมกับ ทั้งหมดเฉลี่ยประมาณ 4 วินาทีต่อการทำสำเร็จ ผมเดาว่าเป็นเพราะขนาดของม ธ . CXTranslationUnit_PrecompiledPreambleมั่นใจได้ว่าreparseTUรวดเร็วมาก อย่างไรก็ตามแม้จะมีCXTranslationUnit_CacheCompletionResults, clang_codeCompleteAtเจ็บปวดช้าสำหรับการใช้งานในกรณีของฉัน
ประธาน

1
@Mehrwolf อ๊าก. ดูความคิดเห็นด้านบน
ประธาน

7
อืมโชคไม่ดี คุณสามารถสร้างความช้าในการแปลให้เสร็จสมบูรณ์บนหน่วยการแปลที่เผยแพร่ต่อสาธารณะ (เช่นโอเพนซอร์ส) ได้หรือไม่? มันจะช่วยได้ถ้าเราสามารถสร้างสิ่งนี้ขึ้นมาได้ด้วยตัวเอง การทำให้เสร็จสมบูรณ์ควรจะเร็วพอ ๆ กับการแยกวิเคราะห์เนื่องจากนั่นคือสิ่งที่ทำภายใน (มันจะฉีดโทเค็นการเติมรหัสพิเศษและแยกวิเคราะห์จนถึงจุดนั้น)
Cameron

คำตอบ:


6

ปัญหาที่ clang_parseTranslationUnit มีคือคำนำหน้าคอมไพล์จะไม่ถูกนำมาใช้ซ้ำในครั้งที่สองที่เรียกว่าการเติมโค้ด การคำนวณคำนำหน้าคอมไพล์จะใช้เวลามากกว่า 90% ของเวลาเหล่านี้ดังนั้นคุณควรอนุญาตให้นำคำนำหน้าที่คอมไพล์ไว้แล้วกลับมาใช้โดยเร็วที่สุด

โดยค่าเริ่มต้นระบบจะใช้ซ้ำในครั้งที่สามที่เรียกเพื่อแยกวิเคราะห์ / แยกวิเคราะห์หน่วยการแปล

ลองดูตัวแปร 'PreambleRebuildCounter' ใน ASTUnit.cpp

ปัญหาอื่น ๆ คือคำนำนี้ถูกบันทึกไว้ในไฟล์ชั่วคราว คุณสามารถเก็บคำนำหน้าคำนำหน้าไว้ในหน่วยความจำแทนที่จะเป็นไฟล์ชั่วคราว มันจะเร็วกว่านี้ :)


สุดยอด! ดูเหมือนจะเป็นประเด็นที่แท้จริง จะตรวจสอบสิ่งนี้และแจ้งให้คุณทราบ ขอบคุณ!
ประธาน

ตกลง! แจ้งให้เราทราบหากมันเหมาะกับคุณ! และหากคุณมีคำถามใด ๆ อย่าลังเลที่จะถามฉัน !!!!
GutiMac

4

บางครั้งความล่าช้าของขนาดนี้เกิดจากการหมดเวลาของทรัพยากรเครือข่าย (NFS หรือ CIFS ใช้ร่วมกันบนเส้นทางการค้นหาไฟล์หรือซ็อกเก็ต) ลองตรวจสอบเวลาการโทรแต่ละระบบจะเสร็จสมบูรณ์โดย prefixing strace -Tf -o trace.outกระบวนการทำงานของคุณด้วย ดูตัวเลขในวงเล็บเหลี่ยมtrace.outสำหรับการเรียกระบบที่ใช้เวลานานในการดำเนินการ

คุณยังสามารถตรวจสอบเวลาระหว่างการเรียกระบบเพื่อดูว่าการประมวลผลไฟล์ใดใช้เวลานานเกินไปในการดำเนินการให้เสร็จสมบูรณ์ strace -rf -o trace.outการทำเช่นนี้คำนำหน้ากระบวนการทำงานของคุณด้วย ดูหมายเลขก่อนการโทรแต่ละระบบเพื่อค้นหาช่วงเวลาการโทรของระบบที่ยาวนาน ย้อนกลับไปจากจุดนั้นโดยมองหาการopenโทรเพื่อดูว่าไฟล์ใดกำลังถูกประมวลผล

หากวิธีนี้ไม่ได้ผลคุณสามารถกำหนดโปรไฟล์กระบวนการของคุณเพื่อดูว่าใช้เวลาส่วนใหญ่ไปที่ใด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.