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-all
ke ./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 install
mencetak tanpa hasil sama sekali.
sumber
./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 lakukanmake install
? Ini akan menambah sedikit waktu yang bisa Anda hindari jika Anda hanya menjalankan emacs dari direktori src../autogen.sh
untuk menghasilkanconfigure
, tapi itu masalah detik, bukan menit.make install
lari diam-diam. Jadi tolong bagi ini menjadi 3 pertanyaan sehingga mereka dapat dilacak secara terpisah dan edit sesuai dengan satu pertanyaan.Jawaban:
Alasan 24.5 membangun begitu cepat bagi Anda adalah karena
.elc
file-file tersebut sebenarnya didistribusikan di tarball, lihat make-dist . Ketika membangun dari git, sebagian besar waktu dihabiskan untuk mengkompilasi.el
file.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?).
Anda selalu dapat mengarahkan ulang output ke
/dev/null
. Untuk percobaan saya, saya menyalurkanmake install
output untukgrep -E '^(make|[A-Z])'
mengurangi output (javascript Travis CI yang memformat log di web mengalami masalah dengan output penuh).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.
sumber
Berikut berbagai saran.
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/Makefile
dan mengubahnya menjadi: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=''
.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, jalankanremake --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
--profile
opsi 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.
sumber
make lisp
mengambil sekitar% 60 persen untuk Emacs 25: travis-ci.org/npostavs/emacs-travis/builds/91107858 . Dan sebagian besarmake src
kompilasi juga, jadi saya bertanya-tanya bagaimana cara mendamaikan pengukuran ini. Dalam Emacs 24 sepertinya hanya mengkompilasicc-*.el
file selamamake lisp
, apakah itu bug?CFLAGS=''
yang membuat kompilasi C lebih cepat dan kompilasi lump lebih lambat. Ternyata, penggunaanCFLAGS='-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