สร้าง Emacs ที่น้อยที่สุด 25 สำหรับการทดสอบหน่วย


10

ฉันต้องการสร้างชุดตัวส่งสัญญาณ Emacs ที่น้อยมากสำหรับการทดสอบหน่วยแพคเกจ Emacs Lisp ของฉัน การสร้างไม่ต้องการ GUI ไม่มีการสนับสนุนภาพ ฯลฯ ควรเป็นล่าม Emacs Lisp ที่น้อยที่สุดกับไลบรารี่หลักของ Emacs Lisp และมันควรจะสร้างได้อย่างรวดเร็วภายในเวลาไม่ถึงห้านาที

ขณะนี้ฉันกำลังผ่านไป--with-x-toolkit=no --without-x --without-all ./configureหลังจากที่มันได้เสร็จแล้วก็บอกฉันว่าตรง Emacs ทั้งหมดจะใช้งาน แต่โชคร้ายที่สร้างยังคงใช้เวลาเกือบนาทีสิบ

ผมเข้าใจว่ามันอาจจะเป็นไปไม่ได้ที่จะได้รับ Emacs สร้างได้เร็วขึ้น แต่สิ่งที่ทำให้ผมแปลกใจก็คือว่าด้วยธงเดียวกันมาก Emacs 24.5 สร้างในเพียงเกี่ยวกับสองนาที

อะไรคือสาเหตุของความแตกต่างขั้นต้นนี้และฉันสามารถทำให้ Emacs trunk สร้างเร็วเท่า Emacs 24.5 ได้หรือไม่

และในคำถามที่เกี่ยวข้องฉันจะให้ Emacs สร้างอย่างเงียบ ๆ ได้อย่างไร ปัจจุบันเกือบ 80% ของผลการทดสอบหน่วยของฉันคือการสร้าง Emacs โดยหลักการแล้วฉันต้องการmake installพิมพ์ไม่ส่งออกเลย


คุณวางแผนที่จะทำสิ่งนี้บนแพลตฟอร์ม CI บางประเภทหรือไม่? ถ้าไม่ใช่คุณใช้คอมพิวเตอร์ประเภทใด? เห็นได้ชัดว่าความเร็วในการสร้างจะขึ้นอยู่กับโปรเซสเซอร์ของคุณมาก แต่สำหรับฉันจะ./configure --with... && make -j (number of cores * 1.5)เสร็จสิ้นใน 30 วินาที หากคุณกำลังรันบนเครื่องโลคัลตรวจสอบให้แน่ใจว่าใช้อาร์กิวเมนต์ -j เพื่อสร้าง มีเหตุผลที่ดีที่คุณจะทำmake installอย่างไร นี่จะเพิ่มเวลาอีกเล็กน้อยที่คุณสามารถหลีกเลี่ยงได้หากคุณเพียงแค่เรียกใช้ emacs จากไดเรกทอรี src
Jordon Biondo

มันคือ Travis CI แต่ฉันไม่เห็นว่าทำไมถึงเป็นเช่นนั้น เป็นความแตกต่างขั้นต้นระหว่างรุ่น Emacs สองรุ่นที่แตกต่างกันในเครื่องเดียวกันกับที่ฉันต้องการอธิบาย IOW ทำไมลำต้นที่ห้าครั้งนานกว่าจะสร้างบนระบบเดียวกัน ?
Lunaryorn

การสร้างจากที่เก็บข้อมูลจำเป็นต้องสร้างไฟล์บางไฟล์ซึ่งมีอยู่แล้วใน tarballs แบบกระจาย
politza

@politza ไฟล์อะไร ฉันรู้ว่าฉันต้องวิ่ง./autogen.shเพื่อสร้างconfigureแต่นั่นเป็นเรื่องของไม่กี่วินาทีไม่ใช่นาที
Lunaryorn

2
@lunaryom คุณมีคำถามสามข้อแยกกันที่นี่ 1: วิธีสร้าง emacs อย่างรวดเร็ว, 2: ทำไม emacs 25 จึงสร้างได้ช้ากว่า emacs 24.5 และ 3: วิธีทำให้การmake installทำงานเงียบลง ดังนั้นโปรดแบ่งคำถามเหล่านี้ออกเป็น 3 คำถามเพื่อให้สามารถติดตามแยกต่างหากและแก้ไขได้ตามคำถามเดียว
rocky

คำตอบ:


8

เหตุผลที่ 24.5 สร้างอย่างรวดเร็วสำหรับคุณก็คือว่า.elcไฟล์ที่มีการกระจายจริงใน tarball ให้ดูทำให้อ เมื่อสร้างจากคอมไพล์เวลาส่วนใหญ่จะใช้ในการรวบรวม.elไฟล์เข้า.elcมา ด้วยการปรับรหัส C ให้เหมาะสมการรวบรวมเสียงกระเพื่อมสามารถทำงานได้เร็วขึ้น แต่ก็ยังใช้เวลานาน เปรียบเทียบเวลาสร้างโดยใช้การตั้งค่าดั้งเดิมของคุณ (~ 14 กับ ~ 1 นาที) กับรุ่นที่ใช้CFLAGS='-O2 -march=native' (~ 9 เทียบกับ ~ 1.5 นาที)

นอกจากนี้การโคลนจากคอมไพล์จะใช้เวลาประมาณหนึ่งนาทีในขณะที่การดาวน์โหลดและการแกะ tarball นั้นใช้เวลาประมาณ 5 วินาที เปรียบเทียบเวลาสร้างระหว่างรุ่นเมื่อดาวน์โหลดไฟล์เก็บถาวร git จาก github (~ 5, ~ 6, ~ 8 นาทีสำหรับ v24.5, master และ emacs-25 ตามลำดับอย่างที่คุณเห็นเมื่อไม่ได้ใช้ tarball แจกจ่ายทั้งหมด เวลาในการสร้างเป็นอย่างน้อยลำดับเดียวกันของขนาด (ไม่แน่ใจว่าทำไม emacs-25 จึงช้ากว่าต้นแบบอาจเป็นรูปแบบสุ่มหรือรหัสบางอย่างที่ล้าสมัยถูกลบออกในต้นแบบ?)

และในคำถามที่เกี่ยวข้องฉันจะให้ Emacs สร้างอย่างเงียบ ๆ ได้อย่างไร ปัจจุบันเกือบ 80% ของผลการทดสอบหน่วยของฉันคือการสร้าง Emacs โดยหลักการแล้วฉันต้องการmake installพิมพ์ไม่ส่งออกเลย

คุณสามารถเปลี่ยนเส้นทางผลลัพธ์ไปยัง/dev/nullเสมอ สำหรับการทดลองของฉันฉันได้make installส่งเอาต์พุตไปที่grep -E '^(make|[A-Z])'เพื่อลดการแสดงผล (จาวาสคริปต์ Travis CI ที่จัดรูปแบบบันทึกบนเว็บกำลังมีปัญหากับเอาต์พุตเต็ม)

ฉันจะทำให้ Emacs trunk สร้างเร็วเท่า Emacs 24.5 ได้ไหม?

ไม่ (หรือใช่ในแง่ที่ว่าคุณสามารถทำให้ Emacs 24.5 สร้างได้ (เกือบ) ช้าเท่ากับ Emacs trunk: p) แต่สิ่งที่คุณสามารถทำได้คือบันทึกการสร้าง Emacs และเพียงแค่ดาวน์โหลดผลลัพธ์ที่แคชสำหรับการทดสอบหน่วย ฉันใช้สิ่งนี้ในสาขาอัพโหลดของส้อม emacs-travis ของฉันนี่คือตัวอย่างที่ใช้โดย yasnippet : เวลาในการติดตั้งของ Emacs คือ ~ 2.5 วินาที


3

นี่คือคำแนะนำที่หลากหลาย

  1. ไม่มีไฟล์ elc

ดังที่ระบุไว้ด้านล่างรวบรวมไฟล์เสียงกระเพื่อมทั้งหมดบัญชีอย่างน้อย 10% ของเวลา วิธีหนึ่งในการปิดใช้งานนั่นคือการแก้ไขเป้าหมายloaddefsในไฟล์lisp/Makefileและเปลี่ยนเป็น:

    $(lisp)/loaddefs.el: $(LOADDEFS)
          true
  1. ไม่มีการเพิ่มประสิทธิภาพของคอมไพเลอร์หรือตารางสัญลักษณ์ดีบักเกอร์

ขณะนี้ฉันกำลังผ่าน --with-x-toolkit = no --without-x - โดยไม่ต้องทั้งหมดไปยัง. / กำหนดค่า

ฉันสามารถลดเวลาการคอมไพล์ C เป็น 1/4 เวลา (จากน้อยกว่านาทีเป็น 16 วินาที) ในsrcเพียงแค่เปลี่ยนค่าสถานะการคอมไพล์เริ่มต้น เริ่มต้น CFLAGS -g -O3ผมได้รับ:

CFLAGS=''เพื่อใช้แทน

  1. อย่าเรียกใช้make installแต่ให้เรียกใช้ emacs ที่สร้างขึ้นจากภายในไดเรกทอรีsrc

ตามที่ระบุไว้ด้านล่างอีก 10% ของเวลาอยู่ในการสร้างเอกสาร แม้ว่าฉันจะไม่ได้เวลา แต่ก็ไม่ต้องสงสัยเลยว่าการคัดลอกไฟล์และการบีบอัดไฟล์ elisp มีอยู่make installมากมาย ดังนั้นอย่า remake --profileหากคุณต้องการที่จะทำซ้ำชาร์ตระยะเวลาการทำงาน

ข้อสังเกตข้างต้นเป็นไปตามด้านล่าง ....


ขั้นตอนแรกคือการทำความเข้าใจเวลาที่ใช้ในการหาวิธีลด โชคดีสำหรับบางอย่างเช่น Emacs ฉันเพิ่งเขียนเครื่องมือ (หรือขยายออกไป) เพื่อช่วยคุณค้นหา ฉันได้เพิ่ม--profileตัวเลือกในการสร้างใหม่ (ทางแยกของ GNU make) ซึ่งจะบอกคุณว่าใช้เวลาเท่าไรในเป้าหมายที่เฉพาะเจาะจง

ฉันพยายามสร้างภาพรวมล่าสุดและใช่ใช้เวลาประมาณ 10 นาที หากคุณไม่ได้ติดตั้ง remake ใหม่ฉันมีส่วนสำคัญของข้อมูลการทำโปรไฟล์ที่คุณสามารถใช้งานได้ ฉันใช้ kcachegrind เพื่อแสดงข้อมูล แต่อาจมีเครื่องมืออื่น ๆ สำหรับเครื่องมือสร้างภาพข้อมูล มี png ในส่วนสำคัญซึ่งเป็นภาพหน้าจอของการทำงาน

ตอนนี้ไปที่รายละเอียด ...

ในการทำงานของฉันใช้เวลาประมาณ 20% ในการสร้างเสียงกระเพื่อมและไฟล์ข้อมูลที่คุณไม่จำเป็นต้องทำจริงๆ จริงๆแล้วจะใช้เวลาเล็กน้อยในไฟล์เสียงกระเพื่อมมากกว่าในไฟล์ข้อมูล คุณอาจเปลี่ยน Makefile เพื่อข้ามไป

มันอาจจะน่าสนใจที่จะเปรียบเทียบกับ emacs 24 ฉันเดาว่าขนาดของทั้งสองนี้เพิ่มขึ้นตามสัดส่วน

หากมีความสนใจ (ซึ่งคุณสามารถแสดงโดย upvotes) ฉันจะแนะนำแฮ็กเฉพาะไปยัง Makefile อย่างไรก็ตามสิ่งนี้ควรเพียงพอสำหรับผู้ที่มีแรงบันดาลใจในการทำงาน


"20% ของเวลาที่ใช้ในการสร้างเสียงกระเพื่อม" - ฉันโคลน @ lunaryorn ของemacs-เทรวิส repo ดูเหมือนว่าmake lispมีการใช้ทั่ว% ร้อยละ 60 สำหรับ Emacs 25: travis-ci.org/npostavs/emacs-travis/builds/91107858 และกลุ่มก้อนขนาดใหญ่make srcก็รวบรวมเสียงกระเพื่อมดังนั้นฉันสงสัยว่าจะกระทบยอดการวัดเหล่านี้อย่างไร ใน Emacs 24 ดูเหมือนว่าจะรวบรวมเฉพาะcc-*.elไฟล์ระหว่างmake lispมันเป็นข้อผิดพลาดหรือไม่?
npostavs

นอกจากนี้อาจเป็นภาพลวงตา แต่ฉันเห็นว่าภาพโปรไฟล์ของคุณจะเพิ่มขึ้นรวมประมาณ 50% เท่านั้น
npostavs

@npostavs สร้างเฉพาะโปรไฟล์เวลาของเป้าหมาย แต่ไม่รวมตัวเอง มีความเป็นไปได้และเป็นไปได้ว่าไฟล์และไดเรกทอรีทั้งหมดภายใต้เสียงกระเพื่อมมีเวลาพอสมควรใน "remake" / "make" ในการคำนวณว่าจะสร้างอะไร นอกจากนี้แม้ว่า 'remake' เป็นทางแยกดังนั้นสิ่งที่พวกเขาทำคล้ายกันสำหรับการเปรียบเทียบอย่างใกล้ชิดคุณควรเปรียบเทียบเวลาของการทำโปรไฟล์ของ remake ด้วย "remake" โดยไม่ทำโปรไฟล์ไม่ใช่ "make" และด้วย remake เดียวกัน / ให้รุ่นสุดท้ายถึงแม้คนหนึ่งสามารถพูดเล่นลิ้นกับ% s 'และอื่น ๆ ข้อเสนอแนะโดยรวมดูเหมือนจะนำไปใช้โดยใช้ข้อมูลของคุณ..
หิน

นอกจากนี้การวัดของฉันใช้CFLAGS=''ซึ่งทำให้การคอมไพล์ C เร็วขึ้นและการคอมไพล์ช้าลง ตามที่ปรากฎการใช้CFLAGS='-O2 -march=native'โดยรวมจะเร็วขึ้นสำหรับ Emacs 25 แต่ช้าลงสำหรับ Emacs 24.5: travis-ci.org/npostavs/emacs-travis/builds/91142923
npostavs

@npostavs คุณสังเกต: การตั้งค่า CFLAGS "ทำให้การคอมไพล์ C เร็วขึ้นและการคอมไพล์ช้าลง" แต่ถ้าคุณจะทำการทดสอบครั้งเดียวฉันไม่แน่ใจว่าเวลาโดยรวม: คอมไพล์ / build + L + C คอมไพล์ / build + LISP คอมไพล์ + LISP + รัน LISP น้อยกว่า unoptimized C คอมไพล์ / build + no LISP คอมไพล์ + ทดสอบ LISP
ร็อคกี้
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.