Buat Emacs 25 minimum untuk pengujian unit

10

Saya ingin membangun varian bagasi Emacs yang sangat minimal untuk pengujian unit pada paket Emacs Lisp saya. Membangun tidak memerlukan GUI, tidak ada dukungan gambar, dll. Seharusnya dasarnya hanya menjadi minimal interpreter Emacs Lisp dengan perpustakaan inti Emacs Lisp, dan itu harus membangun cepat , idealnya dalam waktu kurang dari lima menit.

Saat ini, aku melewati --with-x-toolkit=no --without-x --without-allke ./configure. Setelah selesai, ia memberi tahu saya bahwa semua fitur Emacs dinonaktifkan, tetapi sayangnya prosesnya masih membutuhkan waktu hampir sepuluh menit .

Saya mengerti bahwa mungkin tidak mungkin membuat Emacs membangun lebih cepat, tetapi yang membuat saya bertanya-tanya adalah bahwa dengan bendera yang sama, Emacs 24.5 dibangun hanya dalam waktu sekitar dua menit .

Apa alasan untuk perbedaan besar ini, dan bisakah saya membuat bagasi Emacs secepat Emacs 24.5?

Dan, dalam pertanyaan terkait, bagaimana cara saya membuat Emacs untuk membangun dengan diam-diam? Saat ini hampir 80% dari output unit test saya adalah bangunan Emacs. Idealnya, saya ingin make installmencetak tanpa hasil sama sekali.

lunaryorn
sumber
Apakah Anda berencana melakukan ini pada beberapa jenis platform CI? Jika tidak, komputer seperti apa yang Anda gunakan? Tentunya kecepatan build akan sangat tergantung pada prosesor Anda, tetapi bagi saya ./configure --with... && make -j (number of cores * 1.5)selesai dalam 30 detik. Jika Anda menggunakan mesin lokal, pastikan untuk menggunakan argumen -j untuk membuat. Apakah ada alasan bagus untuk Anda lakukan make install? Ini akan menambah sedikit waktu yang bisa Anda hindari jika Anda hanya menjalankan emacs dari direktori src.
Jordon Biondo
Itu Travis CI, tapi saya tidak mengerti mengapa itu penting? Ini perbedaan besar antara dua versi Emacs yang berbeda di mesin yang sama yang ingin saya jelaskan. TKI mengapa batang yang lima kali lebih lama untuk membangun pada sistem yang sama ?
lunaryorn
Membangun dari repositori perlu membuat file tertentu, yang sudah ada di tarbal yang didistribusikan.
politza
@politza File apa? Saya tahu bahwa saya perlu menjalankan ./autogen.shuntuk menghasilkan configure, tapi itu masalah detik, bukan menit.
lunaryorn
2
@ lunaryom Anda memiliki tiga pertanyaan terpisah di sini. 1: cara membangun emacs cepat, 2: mengapa emacs 25 membangun lebih lambat dari emacs 24.5 dan 3: cara membuat make installlari diam-diam. Jadi tolong bagi ini menjadi 3 pertanyaan sehingga mereka dapat dilacak secara terpisah dan edit sesuai dengan satu pertanyaan.
berbatu

Jawaban:

8

Alasan 24.5 membangun begitu cepat bagi Anda adalah karena .elcfile-file tersebut sebenarnya didistribusikan di tarball, lihat make-dist . Ketika membangun dari git, sebagian besar waktu dihabiskan untuk mengkompilasi .elfile .elc. Dengan mengoptimalkan kode C, kompilasi Lisp dapat berjalan lebih cepat, tetapi masih membutuhkan waktu lama. Bandingkan membangun kali menggunakan pengaturan asli Anda (~ 14 vs ~ 1 menit) dengan membangun menggunakanCFLAGS='-O2 -march=native' (~ 9 vs ~ 1,5 menit).

Juga, kloning dari git membutuhkan waktu sekitar satu menit, sementara mengunduh dan membongkar tarbal membutuhkan waktu sekitar 5 detik. Bandingkan waktu pembuatan antar versi ketika mengunduh arsip git dari github (~ 5, ~ 6, ~ 8 menit masing-masing untuk v24.5, master, dan emacs-25. Seperti yang Anda lihat, saat tidak menggunakan tarball distribusi, semua waktu build setidaknya sama besarnya besarnya. (tidak yakin mengapa emacs-25 lebih lambat dari master, bisa variasi acak, atau beberapa kode usang dihapus pada master?).

Dan, dalam pertanyaan terkait, bagaimana cara saya membuat Emacs untuk membangun dengan diam-diam? Saat ini hampir 80% dari output unit test saya adalah bangunan Emacs. Idealnya, saya ingin make installmencetak tanpa hasil sama sekali.

Anda selalu dapat mengarahkan ulang output ke /dev/null. Untuk percobaan saya, saya menyalurkan make installoutput untuk grep -E '^(make|[A-Z])'mengurangi output (javascript Travis CI yang memformat log di web mengalami masalah dengan output penuh).

dapatkah saya membuat trunk Emacs untuk membangun secepat Emacs 24.5?

Tidak (atau ya dalam arti bahwa Anda bisa mendapatkan Emacs 24.5 untuk membangun (hampir) selambat Emacs trunk: p). Tapi yang bisa Anda lakukan adalah menyimpan build Emacs, dan unduh saja hasil cache untuk pengujian unit. Saya telah menerapkan ini di cabang unggah garpu emacs-travis saya, berikut adalah contoh penggunaan oleh yasnippet : Waktu pemasangan Emacs ~ 2,5 detik.

npostavs
sumber
3

Berikut berbagai saran.

  1. Tidak ada file elc.

Seperti yang dinyatakan di bawah ini, kompilasi semua akun file lisp setidaknya 10% dari waktu. Salah satu cara untuk menonaktifkannya adalah dengan mengedit target loaddef dalam file lisp/Makefiledan mengubahnya menjadi:

    $(lisp)/loaddefs.el: $(LOADDEFS)
          true
  1. Tidak ada optimisasi kompiler atau tabel simbol debugger

Saat ini, saya meneruskan --with-x-toolkit = no --without-x --without-all ke ./configure.

Saya dapat mengurangi waktu kompilasi C menjadi 1/4 waktu (dari sedikit kurang dari menit menjadi 16 detik) di src hanya mengubah flag kompilasi default. Default CFLAGS aku memiliki pernah: -g -O3.

Jadi gunakan saja CFLAGS=''.

  1. Jangan lari make install, tetapi jalankan saja emacs bawaan dari dalam direktori src .

Seperti yang dinyatakan di bawah ini, 10% waktu lainnya dalam membangun dokumen. Meskipun saya tidak menghitung waktu, tidak ada keraguan banyak waktu menyalin file dan mengompresi file elisp make install. Jadi jangan. Jika Anda ingin mengulang grafik pengaturan waktu, jalankan remake --profile.

Pengamatan di atas didasarkan pada ....


Langkah pertama adalah memahami di mana waktu dihabiskan untuk mencari tahu cara menguranginya. Untungnya untuk sesuatu seperti Emacs, saya baru-baru ini menulis (atau lebih tepatnya diperpanjang) alat untuk membantu Anda mengetahuinya. Saya menambahkan --profileopsi untuk membuat kembali (garpu GNU make) yang akan memberi tahu Anda berapa banyak waktu yang dihabiskan dalam target tertentu.

Saya mencoba membuat snapshot baru-baru ini dan ya butuh sekitar 10 menit. Jika Anda belum menginstal ulang remake, saya memiliki intisari informasi profil yang dapat Anda gunakan untuk menjalankan saya. Saya menggunakan kcachegrind untuk menampilkan informasi tetapi mungkin ada alat lain di luar sana untuk alat visualisasi. Ada png di intinya yang merupakan screenshot dari proses.

Sekarang untuk detailnya ...

Dalam menjalankan saya, sekitar 20% dari waktu dihabiskan untuk membangun file lisp dan info yang Anda tidak perlu lakukan. Sebenarnya sedikit lebih banyak dihabiskan di file lisp daripada di file info. Anda mungkin dapat mengubah Makefile untuk melewati itu.

Mungkin menarik untuk membandingkannya dengan emacs 24. Dugaan saya adalah bahwa ukuran keduanya telah berkembang secara proporsional.

Jika ada minat (yang dapat Anda tunjukkan dengan upvotes), saya akan menyarankan peretasan tertentu ke Makefile. Namun ini dengan sendirinya harus cukup bagi seseorang yang bermotivasi untuk bekerja.

berbatu
sumber
"20% dari waktu dihabiskan untuk membangun lisp" - Saya mengkloning repo emacs-travis @ lunaryorn sepertinya make lispmengambil sekitar% 60 persen untuk Emacs 25: travis-ci.org/npostavs/emacs-travis/builds/91107858 . Dan sebagian besar make srckompilasi juga, jadi saya bertanya-tanya bagaimana cara mendamaikan pengukuran ini. Dalam Emacs 24 sepertinya hanya mengkompilasi cc-*.elfile selama make lisp, apakah itu bug?
npostavs
Juga, ini mungkin pada ilusi optik, tetapi bagi saya terlihat bahwa gambar profil Anda hanya menambahkan hingga sekitar 50% total.
npostavs
@npostavs hanya membuat profil saat target, itu tidak termasuk dirinya sendiri. Mungkin dan kemungkinan bahwa dengan semua file dan direktori di bawah lisp, ada banyak waktu yang dihabiskan dalam "remake" / "make" dalam menghitung apa yang akan dibuat kembali. Juga, meskipun 'remake "adalah fork dari make, jadi apa yang mereka lakukan adalah serupa, untuk perbandingan yang lebih dekat Anda harus membandingkan waktu outputing pembuatan profil remake dengan" remake "tanpa membuat profil, bukan" membuat ". Dan juga dengan remake yang sama / membuat versi. Terakhir, meskipun orang dapat berdalih dengan% 's dan seterusnya, saran keseluruhan tampaknya berlaku menggunakan data Anda.
rocky
Juga, pengukuran saya menggunakan CFLAGS=''yang membuat kompilasi C lebih cepat dan kompilasi lump lebih lambat. Ternyata, penggunaan CFLAGS='-O2 -march=native'secara keseluruhan lebih cepat untuk Emacs 25, meskipun lebih lambat untuk Emacs 24.5: travis-ci.org/npostavs/emacs-travis/builds/91142923
npostavs
@npostavs Anda amati: mengatur CFLAGS "membuat kompilasi C lebih cepat dan kompilasi pelat lebih lambat." Tetapi jika Anda akan menjalankan tes tunggal, saya tidak yakin apakah keseluruhan waktu: kompilasi / build C semacam-dioptimalkan + kompilasi LISP + menjalankan uji LISP akan kurang dari kompilasi C yang tidak dioptimalkan / build + tidak ada LISP kompilasi + uji coba LISP.
berbatu