Xây dựng một Emacs tối thiểu 25 để thử nghiệm đơn vị


10

Tôi muốn xây dựng một biến thể rất nhỏ của thân Emacs để thử nghiệm đơn vị gói Emacs Lisp của tôi. Bản dựng không cần GUI, không hỗ trợ hình ảnh, v.v. Về cơ bản, nó chỉ nên là một trình thông dịch Emacs Lisp tối thiểu với các thư viện Emacs Lisp cốt lõi, và nó sẽ xây dựng nhanh , lý tưởng trong chưa đầy năm phút.

Hiện tại, tôi đang chuyển --with-x-toolkit=no --without-x --without-allđến ./configure. Sau khi hoàn thành, nó cho tôi biết rằng tất cả các tính năng của Emacs đều bị tắt, nhưng thật không may, quá trình xây dựng vẫn mất gần mười phút .

Tôi hiểu rằng có thể không thể khiến Emacs xây dựng nhanh hơn, nhưng điều khiến tôi băn khoăn là với những lá cờ rất giống Emacs 24.5 được xây dựng chỉ trong khoảng hai phút .

Lý do cho sự khác biệt lớn này là gì và tôi có thể có được thân cây Emacs để xây dựng nhanh như Emacs 24.5 không?

Và, trong một câu hỏi liên quan, làm thế nào để tôi có thể xây dựng Emacs một cách lặng lẽ? Hiện tại gần 80% sản lượng thử nghiệm đơn vị của tôi là tòa nhà Emacs. Lý tưởng nhất là tôi muốn make installin không có đầu ra nào cả.


Bạn có kế hoạch làm điều này trên một số loại nền tảng CI? Nếu không bạn đang sử dụng loại máy tính nào? Rõ ràng tốc độ xây dựng sẽ phụ thuộc rất nhiều vào bộ xử lý của bạn, nhưng đối với tôi ./configure --with... && make -j (number of cores * 1.5)hoàn thành sau 30 giây. Nếu bạn đang chạy trên một máy cục bộ, hãy đảm bảo sử dụng đối số -j để thực hiện. Có một lý do tốt để bạn làm make install? Điều này sẽ thêm một chút thời gian bạn có thể tránh nếu bạn chỉ chạy emacs từ thư mục src.
Jordon Biondo

Đó là Travis CI, nhưng tôi không hiểu tại sao điều đó lại quan trọng? Đó là sự khác biệt lớn giữa hai phiên bản Emacs khác nhau trong cùng một máy mà tôi muốn giải thích. IOW tại sao thân cây dài hơn năm lần để xây dựng trên cùng một hệ thống ?
lunaryorn

Xây dựng từ một kho lưu trữ cần phải tạo một số tệp nhất định, đã có trong tarball phân tán.
Politza

@politza Tập tin gì? Tôi biết rằng tôi cần phải chạy ./autogen.shđể tạo configure, nhưng đó chỉ là vài giây chứ không phải vài phút.
lunaryorn 18/07/2015

2
@lunaryom Bạn có ba câu hỏi riêng biệt ở đây. 1: cách xây dựng emacs nhanh, 2: tại sao emacs 25 xây dựng chậm hơn so với emacs 24.5 và 3: làm thế nào để make installchạy âm thầm. Vì vậy, vui lòng chia chúng thành 3 câu hỏi để chúng có thể được theo dõi riêng và chỉnh sửa câu hỏi này cho phù hợp với một câu hỏi.
đá

Câu trả lời:


8

Lý do 24.5 xây dựng rất nhanh cho bạn là các .elctệp thực sự được phân phối trong tarball, xem make-dist . Khi xây dựng từ git, phần lớn thời gian được dành để biên dịch các .eltệp vào .elc. Bằng cách tối ưu hóa mã C, quá trình biên dịch Lisp có thể diễn ra nhanh hơn, nhưng vẫn mất nhiều thời gian. So sánh thời gian xây dựng bằng cài đặt gốc của bạn (~ 14 so với ~ 1 phút) với bản dựng bằng cách sử dụngCFLAGS='-O2 -march=native' (~ 9 so với ~ 1,5 phút).

Ngoài ra, nhân bản từ git mất khoảng một phút, trong khi tải xuống và giải nén tarball mất khoảng 5 giây. So sánh thời gian xây dựng giữa các phiên bản khi tải xuống kho lưu trữ git từ github (~ 5, ~ 6, ~ 8 phút cho v24.5, master và emacs-25, như bạn có thể thấy, khi không sử dụng tarball phân phối, tất cả các thời gian xây dựng ít nhất là cùng một thứ tự cường độ. (không chắc tại sao emacs-25 chậm hơn so với chủ, có thể là biến thể ngẫu nhiên hoặc một số mã lỗi thời đã bị xóa trong tổng thể?).

Và, trong một câu hỏi liên quan, làm thế nào để tôi có thể xây dựng Emacs một cách lặng lẽ? Hiện tại gần 80% sản lượng thử nghiệm đơn vị của tôi là tòa nhà Emacs. Lý tưởng nhất là tôi muốn make installin không có đầu ra nào cả.

Bạn luôn có thể chuyển hướng đầu ra /dev/null. Đối với các thử nghiệm của mình, tôi đã chuyển make installđầu ra để grep -E '^(make|[A-Z])'cắt giảm đầu ra (javascript Travis CI định dạng nhật ký trên web gặp sự cố với đầu ra đầy đủ).

Tôi có thể lấy thân cây Emacs để xây dựng nhanh như Emacs 24.5 không?

Không (hoặc có theo nghĩa là bạn có thể lấy Emacs 24.5 để xây dựng (gần như) chậm như thân cây Emacs: p). Nhưng những gì bạn có thể làm là lưu bản dựng Emacs và chỉ cần tải xuống kết quả được lưu trong bộ nhớ cache đó để kiểm tra đơn vị. Tôi đã thực hiện điều này trong nhánh tải lên của ngã ba emacs-travis của mình, đây là một ví dụ được sử dụng bởi yasnippet : Thời gian cài đặt Emacs là ~ 2,5 giây.


3

Dưới đây là những gợi ý khác nhau.

  1. Không có tập tin elc.

Như đã nêu dưới đây, biên dịch tất cả các tệp lisp chiếm ít nhất 10% thời gian. Một cách để vô hiệu hóa đó là chỉnh sửa mục tiêu loaddefs trong tệp lisp/Makefilevà thay đổi đó thành:

    $(lisp)/loaddefs.el: $(LOADDEFS)
          true
  1. Không có bảng biểu tượng tối ưu hóa trình biên dịch hoặc trình gỡ lỗi

Hiện tại, tôi đang chuyển --with-x-toolkit = no --without-x --without-all to ./cool.

Tôi đã có thể giảm thời gian biên dịch C xuống còn 1/4 thời gian (từ ít hơn một chút đến 16 giây) trong src chỉ thay đổi các cờ biên dịch mặc định. CFLAGS mặc định tôi nhận được là : -g -O3.

Vì vậy, sử dụng thay thế CFLAGS=''.

  1. Đừng chạy make install, mà chỉ chạy các emacs được xây dựng từ bên trong thư mục src .

Như đã nêu dưới đây, 10% thời gian khác là trong việc xây dựng tài liệu. Mặc dù tôi không có thời gian, nhưng không có nghi ngờ gì về việc sao chép tập tin và nén các tập tin elisp vào make install. Vì vậy, không. Nếu bạn muốn làm lại các biểu đồ thời gian, hãy chạy remake --profile.

Các quan sát trên được dựa trên dưới đây ....


Bước đầu tiên là hiểu thời gian được sử dụng để tìm ra cách giảm bớt nó. May mắn thay cho một cái gì đó như Emacs, gần đây tôi đã viết (hoặc mở rộng) một công cụ để giúp bạn tìm hiểu. Tôi đã thêm một --profiletùy chọn để làm lại (một nhánh của GNU make) sẽ cho bạn biết bao nhiêu thời gian dành cho các mục tiêu cụ thể.

Tôi đã thử xây dựng một ảnh chụp nhanh gần đây và có mất khoảng 10 phút. Nếu bạn chưa cài đặt lại, tôi có một thông tin chính xác về thông tin bạn có thể sử dụng. Tôi sử dụng kcachegrind để hiển thị thông tin nhưng có thể có các công cụ khác hiện có cho các công cụ trực quan. Có một png trong ý chính là một ảnh chụp màn hình của cuộc chạy.

Bây giờ đến chi tiết ...

Trong quá trình của tôi, khoảng 20% ​​thời gian được dành cho việc xây dựng các tệp thông tin và thông tin mà bạn không thực sự cần phải làm. Trên thực tế, một ít chi tiêu trong các tệp lisp hơn trong các tệp thông tin. Bạn có thể thay đổi Makefile để bỏ qua điều đó.

Có thể thú vị khi so sánh với emacs 24. Tôi đoán là kích thước của cả hai đã tăng theo tỷ lệ thuận.

Nếu có sự quan tâm (mà bạn có thể hiển thị bằng cách nâng cấp), tôi sẽ đề xuất các bản hack cụ thể cho Makefile. Tuy nhiên, điều này tự nó đã đủ cho một người có động lực làm việc.


"20% thời gian dành cho việc xây dựng lisp" - Tôi đã nhân bản repo @ lunaryorn's emacs-travis, có vẻ như make lispchiếm khoảng 60% cho Emacs 25: travis-ci.org/npostavs/emacs-travis/builds/91107858 . Và một đoạn lớn make srccũng đang biên dịch lisp, vì vậy tôi tự hỏi làm thế nào để điều hòa các phép đo này. Trong Emacs 24 có vẻ như nó chỉ biên dịch cc-*.elcác tệp trong thời gian này make lisp, nó có phải là một lỗi không?
npostavs

Ngoài ra, điều này có thể là trên ảo ảnh quang học, nhưng đối với tôi, hình ảnh hồ sơ của bạn chỉ tăng tổng cộng khoảng 50%.
npostavs

@npostavs làm lại chỉ hồ sơ thời gian của mục tiêu, nó không bao gồm chính nó. Có thể và có khả năng là với tất cả các tệp và thư mục dưới dạng lisp, có thời gian đáng kể để "làm lại" / "thực hiện" trong việc tính toán những gì cần làm lại. Ngoài ra, mặc dù 'làm lại "là một nhánh của sản phẩm, vì vậy những gì họ làm là tương tự nhau, để so sánh gần hơn, bạn nên so sánh thời gian sản xuất hồ sơ làm lại với" làm lại "mà không cần định hình, không phải" làm lại ". tạo phiên bản. Cuối cùng, mặc dù người ta có thể ngụy biện với% và v.v., các đề xuất chung dường như được áp dụng bằng cách sử dụng dữ liệu của bạn.
rocky

Ngoài ra, phép đo của tôi đã được sử dụng CFLAGS=''làm cho quá trình biên dịch C nhanh hơn và quá trình biên dịch chậm hơn. Hóa ra, sử dụng CFLAGS='-O2 -march=native'tổng thể nhanh hơn cho Emacs 25, mặc dù chậm hơn cho Emacs 24.5: travis-ci.org/npostavs/emacs-travis/builds/91142923
npostavs

@npostavs Bạn quan sát: thiết lập CFLAGS "làm cho quá trình biên dịch C nhanh hơn và quá trình biên dịch chậm hơn." Nhưng nếu bạn định chạy thử nghiệm đơn lẻ, tôi không chắc liệu thời gian tổng thể: biên dịch / xây dựng C được tối ưu hóa một số + biên dịch LISP + chạy thử nghiệm LISP sẽ ít hơn so với biên dịch C không biên dịch / xây dựng + không LISP biên dịch + chạy thử LISP.
đá
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.