zsh ทำอย่างช้าๆด้วย path
ฉันมีปัญหาด้านประสิทธิภาพมาระยะหนึ่งแล้วเมื่อทำการเติมข้อความอัตโนมัติในโฟลเดอร์โดยใช้ zsh ในที่สุดฉันก็ทุ่มเทเวลาเพื่อพยายามทำความเข้าใจว่าอะไรเป็นสาเหตุของปัญหาและจะแก้ไขได้อย่างไร น่าเสียดายที่ฉันต้องหยุดใน WHAT วิธีแก้ปัญหายังคงเป็นเครื่องหมายคำถาม
เมื่อเรียกใช้ zsh ในการดีบักโดยเปิดใช้งานการติดตาม (และปิดใช้งานของฉัน.zshrc.local) ฉันจัดการเพื่อให้เห็นได้ชัดเจน:
เมื่อกด TAB สองครั้ง$ cd ~/Documents/<TAB>ฉันจะได้รับ:
....
+_cd:88> eval 'dir=( ~Documents/ )'
+(eval):1> dir=( '~Documents/' )
....
ล่าสุดใช้เวลาประมาณ 3 วินาทีในการตอบกลับ
เรื่องนี้เกิดขึ้นในทุกระดับของโฟลเดอร์อัตโนมัติเสร็จ ( cd a/<TAB>, cd a/b/<TAB>, ... ) cd <TAB>ไม่ได้กับ
ฉันได้พยายามตั้งค่าไฟล์set -o magicequalsubst.
คำตอบ
บรรทัดที่ 88 ของ_cdฟังก์ชันการทำให้สมบูรณ์ในเวอร์ชันปัจจุบันzshอยู่ในส่วนที่เข้าถึงได้เมื่อcdablevarsเปิดใช้งานตัวเลือกเท่านั้น
ด้วยตัวเลือกที่อยู่cd usernameหรือcd varจะcdลงในไดเรกทอรีบ้านของusernameผู้ใช้หรือเข้าไปในเส้นทางที่เก็บไว้ใน$varถ้าผู้ใช้ / var ตัวตนและไม่มีusername/ ไดเรกทอรีในไดเรกทอรีปัจจุบันหรือvar $cdpathกล่าวอีกนัยหนึ่งcd fooพฤติกรรมเหมือนcd ~fooว่าfooไม่มีอยู่ในไดเรกทอรี (ใน.หรือ$cdpath)
ตอนนี้ที่เป็นเพียงบางสิ่งบางอย่างที่ทำสำหรับ/cd pushdเมื่อ_cdสร้างรายการความสมบูรณ์ที่เป็นไปได้และคุณได้ป้อนDocuments/จนถึงตอนนี้จำเป็นต้องเสนอรายการไดเร็กทอรีย่อยของDocumentsโฟลเดอร์ให้กับคุณ แต่เนื่องจากคุณได้เปิดใช้งานcdablevarsรายการไดเร็กทอรีย่อยของโฮมไดเร็กทอรีของDocumentsผู้ใช้หรือของ ไดเร็กทอรีที่เก็บไว้ใน$Documentsตัวแปรถ้ามี
eval 'dirs=( ~Documents )'ซึ่งเป็นเหตุผลที่มันทำอย่างนั้น
ตอนนี้ฉันคิดว่าการขยายนั้นอาจช้าหากคุณใช้ระบบที่มีฐานข้อมูลผู้ใช้เครือข่ายขนาดใหญ่โดยไม่ต้องแคชเช่น (LDAP, NIS + ... ) zshจะค้นหาDocumentsในรายการตัวแปรซึ่งควรจะรวดเร็วแม้ว่าคุณจะมีตัวแปรนับล้านเนื่องจาก zsh ใช้ตารางแฮชและเรียกgetpwnam("Documents")เพื่อดึงโฮมไดเร็กทอรีของDocumentsผู้ใช้ซึ่งเป็นส่วนที่อาจช้าในกรณีของคุณ คุณสามารถยืนยันได้โดยพยายามid Documentsที่จะgetpwnam()โทรออกเหมือนเดิม
โดยส่วนตัวฉันจะไม่เข้าใจcdablevarsตัวเลือกนั้นเป็นการส่วนตัวเพราะมันต้องทำให้คุณประหลาดใจไม่วันใดก็วันหนึ่ง หากไม่มีสิ่งนี้คุณสามารถทำได้เสมอcd ~userหรือcd ~varและฉันพบว่ามันดีกว่ามากที่จะขออย่างชัดเจนเมื่อคุณต้องการcdเข้าสู่สิ่งอื่นที่ไม่ใช่ไดเร็กทอรีที่ให้เป็นอาร์กิวเมนต์
นั่นcdablevarsเป็นรุ่นแรกของzshปี 1990 แล้วโดยได้รับแรงบันดาลใจจากtcshสิ่งนั้นโดยค่าเริ่มต้น มันมีมาก่อนการขยายตัวของ~var. cdablevarsควรได้รับการพิจารณาว่าเป็นสิ่งประดิษฐ์ทางประวัติศาสตร์ IMO
สำหรับวิธีแก้ไขความช้าgetpwnam()คุณสามารถดูที่การปรับฐานข้อมูลบริการชื่อ ตัวอย่างเช่นหากใช้sssdคุณสามารถเพิ่มการentry_negative_timeoutตั้งค่าซึ่งกำหนดระยะเวลาในการแคชข้อมูลที่Documentsผู้ใช้ไม่มีอยู่ก่อนที่จะค้นหาแบ็กเอนด์อีกครั้ง ดูเหมือนว่า 3 วินาทีจะมากเกินไปสำหรับการสืบค้นฐานข้อมูลผู้ใช้ซึ่งบ่งชี้ว่าคุณอาจมีปัญหาในการกำหนดค่าหรือเซิร์ฟเวอร์ผู้ให้บริการไม่พร้อมใช้งานและกลไกทางเลือกหากไม่ได้กำหนดค่าด้วยวิธีที่เหมาะสมที่สุด