Birim testi için minimal bir Emacs 25 oluşturun


10

Emacs Lisp paketimi birim test etmek için çok az bir Emacs gövdesi çeşidi oluşturmak istiyorum. Derlemenin GUI'sine, görüntü desteğine vb. İhtiyacı yoktur. Temelde çekirdek Emacs Lisp kütüphaneleriyle asgari bir Emacs Lisp yorumlayıcısı olmalı ve beş dakikadan daha kısa sürede hızlı ve hızlı bir şekilde inşa edilmelidir .

Şu anda, geçiyorum --with-x-toolkit=no --without-x --without-alliçin ./configure. Bittikten sonra, tüm Emacs özelliklerinin devre dışı bırakıldığını söylüyor, ancak maalesef yapı hala yaklaşık on dakika sürüyor .

Emacs'ın daha hızlı inşa edilmesinin imkansız olabileceğini anlıyorum, ama beni merak eden şey, aynı bayraklarla Emacs 24.5'in sadece iki dakika içinde inşa edilmesi .

Bu kaba farkın sebebi nedir ve Emacs bagajının Emacs 24.5 kadar hızlı inşa edilmesini sağlayabilir miyim?

Ve ilgili bir soruda, Emacs'ın sessizce inşa edilmesini nasıl sağlayabilirim? Şu anda birim test çıktısının neredeyse% 80'i Emacs binası. İdeal olarak, make installhiç çıktı basmak istemiyorum.


Bunu bir çeşit CI platformunda mı yapmayı planlıyorsunuz? Değilse, ne tür bir bilgisayar kullanıyorsunuz? Açıkçası, inşa hızı işlemcinize çok bağlı olacak, ancak benim için ./configure --with... && make -j (number of cores * 1.5)30 saniye içinde bitiyor. Yerel bir makinede çalışıyorsanız, yapmak için -j bağımsız değişkenini kullandığınızdan emin olun. Yapmanız için iyi bir neden var mı make install? Bu, sadece src dizininden emacs çalıştırırsanız kaçınabileceğiniz biraz zaman ekleyecektir.
Jordon Biondo

Travis CI, ama bunun neden önemli olduğunu anlamıyorum? Aynı makinede açıklamak istediğim iki farklı Emacs sürümü arasındaki brüt fark . IOW neden aynı sistem üzerine inşa etmek için beş kat daha uzun gövde ?
lunaryorn

Bir havuzdan oluşturmak, dağıtılmış tarballlarda zaten mevcut olan belirli dosyaları oluşturmak için gereklidir.
politza

@politza Hangi dosyalar? ./autogen.shÜretmek için koşmam gerektiğini biliyorum configure, ama bu bir kaç saniye değil, saniyeler içinde.
lunaryorn

2
@lunaryom Burada üç ayrı sorunuz var. 1: emacs nasıl hızlı oluşturulur, 2: emacs 25 neden emacs 24.5 ve 3'ten daha yavaş inşa edilir: make installsessizce nasıl çalıştırılır. Bu yüzden lütfen bunları ayrı ayrı izlenebilmeleri için 3 soruya bölün ve bunları tek bir soruya sadık olacak şekilde düzenleyin.
kayalık

Yanıtlar:


8

Bunun ne sebebi 24.5 kadar çabuk inşa .elcdosyalar aslında tarball dağıtıldığını görmek edilmektedir makyaj dist . Git'ten inşa ederken, zamanın çoğu .eldosyaları derlemek için harcanır .elc. C kodunu optimize ederek, Lisp derlemesi daha hızlı olabilir, ancak yine de uzun zaman alır. Orijinal ayarlarınızı (~ 14'e ~ ~ 1 dakika) kullanarak derleme sürelerini (~ 9'a ~ ~ 1,5 dakika) kullanarak bir derlemeyle karşılaştırınCFLAGS='-O2 -march=native' .

Ayrıca, git'ten klonlama yaklaşık bir dakika sürerken, tarball'ı indirip açmak yaklaşık 5 saniye sürer. Git arşivini github'dan indirirken sürümler arasındaki süreleri karşılaştırın (v24.5, master ve emacs-25 için sırasıyla ~ 5, ~ 6, ~ 8 dakika) Bir dağıtım tarball'ı kullanmadığınızda, tüm Oluşturma süreleri en azından aynı büyüklük sırasına sahiptir. (emacs-25'in neden master'dan daha yavaş olduğundan emin değilsiniz, rasgele varyasyon olabilir veya master'da bazı eski kodlar kaldırıldı mı?).

Ve ilgili bir soruda, Emacs'ın sessizce inşa edilmesini nasıl sağlayabilirim? Şu anda birim test çıktısının neredeyse% 80'i Emacs binası. İdeal olarak, make installhiç çıktı basmak istemiyorum.

Çıkışı istediğiniz zaman yeniden yönlendirebilirsiniz /dev/null. Deneylerim için make installçıktıyı çıktıyı grep -E '^(make|[A-Z])'kesmek için pipetledim (web üzerindeki günlüğü biçimlendiren Travis CI javascript tam çıktı ile sorun yaşıyordu).

24.5'in Emacs 24.5 kadar hızlı inşa edilmesini sağlayabilir miyim?

Hayır (veya evet, Emacs 24.5'in Emacs'ın gövdesi kadar yavaş (neredeyse) inşa edilmesini sağlayabilirsiniz: p). Ancak yapabileceğiniz şey, Emacs derlemesini kaydetmek ve sadece birim test için önbelleğe alınan sonucu indirmek. Bunu emacs-travis çatalımın yükleme şubesine uyguladım , burada yasnippet'in bir örnek kullanımı var : Emacs yükleme süresi ~ 2.5 saniyedir.


3

İşte çeşitli öneriler.

  1. Elc dosyası yok.

Aşağıda belirtildiği gibi, tüm lisp dosyalarının derlenmesi zamanın en az% 10'unu oluşturur. Bunu devre dışı bırakmanın bir yolu, dosyadaki loaddefs hedefini düzenlemek ve bunu şu şekilde lisp/Makefiledeğiştirmektir:

    $(lisp)/loaddefs.el: $(LOADDEFS)
          true
  1. Derleyici optimizasyonu veya hata ayıklayıcı sembol tablosu yok

Şu anda --with-x-toolkit = no --without-x --without-all dizinini ./configure dosyasına geçiriyorum.

Ben sadece varsayılan derleme bayrakları değiştirerek src C derleme süresini (4 dakikadan biraz daha az - 16 saniye) zaman 1/4 azaltmak mümkün . CFLAGS ben got varsayılan olmuştur: -g -O3.

Bunun yerine kullanın CFLAGS=''.

  1. Çalıştırma make install, ancak sadece dahili emacs src dizini içinden çalıştırın .

Aşağıda belirtildiği gibi, zamanın% 10'u dokümanlar inşa etmektir. Zamanım olmasa da, dosyaları kopyalamak ve elisp dosyalarını sıkıştırmak için çok fazla zaman var make install. Öyleyse yapma. Zamanlama çizelgelerini yeniden yapmak istiyorsanız, çalıştırın remake --profile.

Yukarıdaki gözlemler aşağıdakilere dayanmaktadır ....


İlk adım, nasıl azaltılacağını anlamak için zamanın nerede harcandığını anlamaktır. Neyse ki Emacs gibi bir şey için, yakın zamanda öğrenmenize yardımcı olacak bir araç yazdım (veya daha da uzattım). Ben ekledi --profileseçeneği remake belirli hedeflere harcanan ne kadar zaman size söyleyecektir (GNU marka bir çatal).

Yakın zamanda bir anlık görüntü oluşturmayı denedim ve evet yaklaşık 10 dakika sürüyor. Eğer remake kurulu değilse, koşumda kullanabileceğiniz profil bilgilerinin bir özeti var. Bilgileri görüntülemek için kcachegrind kullanıyorum ancak görselleştirme araçları için başka araçlar da olabilir. Gistte koşunun bir ekran görüntüsü olan bir png var.

Şimdi ayrıntılara ...

Koşumda, zamanın yaklaşık% 20'si gerçekten yapmanız gerekmeyen lisp ve bilgi dosyaları oluşturmak için harcanıyor. Aslında lisp dosyalarında bilgi dosyalarından biraz daha fazla harcanır. Bunu yapmak için muhtemelen Makefile'i değiştirebilirsiniz.

Emacs 24 ile karşılaştırmak ilginç olabilir. Tahminimce her ikisinin de boyutları orantılı olarak arttı.

Eğer ilgi varsa (upvotes ile gösterebilirsiniz), Makefile için özel kesmek önereceğim. Ancak bu kendi başına çalışmak için motive olan biri için yeterli olmalıdır.


"Zamanın% 20'si lisp inşasında harcanıyor" - Emarys 25 için tramplenci @ emarys emacs-travis repo klonladımmake lisp 25: travis-ci.org/npostavs/emacs-travis/builds/91107858 . Ve büyük bir parça make srcda lisp derliyor, bu yüzden bu ölçümlerin nasıl uzlaştırılacağını merak ediyorum. Emacs 24'te sadece cc-*.eldosyaları sırasında derler make lisp, bir hata mı?
npostavs

Ayrıca, bu optik yanılsamada olabilir, ancak bana profilleme resminizin toplamda sadece% 50'ye kadar çıktığı görülmektedir.
npostavs

@npostavs remake sadece hedefin zamanını belirler, kendisini içermez. Lisp altındaki tüm dosya ve dizinlerle, yeniden biçimlendirmenin hesaplanmasında "yeniden" / "yapmak" için harcanan zamanın olması muhtemeldir. Ayrıca, 'remake' bir yapım çatalı olmasına rağmen, yaptıkları şey benzerdir, daha yakın karşılaştırmalar için, remake'in profil çıktısı zamanlarını, "make" değil, profilleme olmadan "remake" ile karşılaştırmalısınız.Ayrıca aynı remake / Son olarak,% 's ve benzerleri ile tartışmak mümkün olsa da, genel öneriler verilerinizi kullanarak geçerli görünüyor.
rocky

Ayrıca, CFLAGS=''C derlemesini daha hızlı ve lisp derlemesini yavaşlatan ölçümüm kullanılıyordu. Sonradan anlaşıldı ki, kullanarak CFLAGS='-O2 -march=native', hızlı genel Emacs 25 içindir Emacs 24.5 için yavaş olsa: travis-ci.org/npostavs/emacs-travis/builds/91142923
npostavs

@npostavs Şunları gözlemlersiniz: CFLAGS'ın ayarlanması "C derlemesini hızlandırır ve lisp derlemesini yavaşlatır." Ancak tek bir test yapacaksanız, toplam sürenin belli olup olmadığından emin değilim: bir çeşit optimize edilmiş C derleme / derleme + LISP derleme + LISP test çalıştırması optimize edilmemiş C derleme / derleme + LISP yok derleme + LISP test çalıştırması.
kayalık
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.