Başlangıcımı hızlandırmak için ne yapabilirim?


41

Başlangıç ​​zamanını azaltmak için yapabileceğim bazı temel şeyler nelerdir?

Bu konuda dikkat etmem gereken özel bir şey var mı?

Not: Başlangıç ​​zamanı, Emacs'ı daha az sık başlatarak (oturum başına bir kez) ve dosyaları çalışan bir durumda açarak hafifletilebilir . Bu soru, başlangıç ​​zamanı en aza indirgemekle ilgilidir, oturum başlangıcı için veya Emac'ı başlatırken gerekli olan herhangi bir zaman için.


Ayrıca bkz . Stack Overflow'da cevaplanan aynı soru , 50 ve 30'dan fazla "favori" yer imlerinin üzerinde soru ve cevap puanları. Buradaki iyi cevaplar, Stack Overflow'ta mevcut olanların ötesine gitmelidir.


1
Bu konuda veri sahibi olmayı çok isterdim, ancak benim tahminime göre, çoğu kullanıcı için başlangıç ​​zamanının büyük kısmını oluşturan bir veya iki paket var. Benim durumumda dümen oldu. Eğer dümen kullanıyorsanız, ilk başlatmayı gerçekten erteleyemeyeceğinizi, hemen kullanıma hazır olmasını istediğinizi unutmayın. Sarmaşık oldum ve bu başlangıç ​​zamanımı yaklaşık 12 saniyeden bir saniyeye indirdi. Sunucu / istemci kurulumunu kullanmayı bile bıraktım. (Bu arada, başlangıç ​​zamanını düşürmedim, bu çok hoş bir yan yarardı.)
Omar

Yanıtlar:


43

İşte benim azaltma konusundaki puanlarım emacs-init-time, bu daemon veya sunucu kullanmak gibi şeyleri kapsamıyor, nadiren emacs'leri kapatmanız gerektiğini söylemeden geçiyor.

Yapma:

  • Paketinize uygun otomatik yükleme çerezleri yoksa, giriş komutlarınızda paket yüklemeyi gerektirmezseniz, giriş komutlarında otomatik yükleme yaptığınızdan emin olun. Öyleyse, paketi ilk kullandığınızda foobararayacaksanız foobar-modeve foobarönceden otomatik olarak yüklenmemişse, şunun gibi bir şeye ihtiyacınız olacaktır:

    (autoload 'foobar-mode "foobar")
    

    bu foobar-mode, foobarpaket henüz yüklenmemiş olsa bile aramanıza izin verir . Bu şekilde foobarsiz arayana kadar bu yol yüklenmeyecekfoobar-mode

  • package-refresh-contentsPaketleri başlangıçta yüklemeniz gerekmiyorsa çalıştırmayın . Eğer init konum, eksik paketleri otomatik olarak kurmaya ayarlanmışsa, otomatik kurmanın ne zaman gerçekleşeceğini belirtmek için bir komut satırı argümanı ayarlamayı düşünün.

  • Yukarıdaki gibi, ağla ilgili hiçbir şey yapmayın.
  • desktopGerçekten istemiyorsan init'i yükleme .

Yap

  • use-packagePaketlerinizi yönetmek gibi bir şey kullanın . Bu, neye ihtiyaç duyulacağını, daha sonra ne yükleneceğini, neyin otomatik yükleneceğini belirlemeyi kolaylaştırır ve bir paket üzerinde initinizi paket bazında profillendirmeyi kolaylaştırır.

  • Bir tema yükleme ve etkinleştirme arasındaki farkı öğrenin. Kısacası, istediğiniz kadar yükleyebilirsiniz, ancak birden fazla izin vermediğinizden emin olun. İdeal olarak, yalnızca bir temayı yükleyin ve etkinleştirin. load-themeTemanın etkinleştirilmesini önlemek için isteğe bağlı bir argüman gerekir. Başlatma sırasında yavaş ve çirkin olan çoklu temaların yanlışlıkla etkinleştirilmesi kolay olabilir.

  • Hile yapın: Genellikle init yüklemek istediğiniz genel modlar, geri alma ağacı, otomatik tamamlama, ido modu gibi şeyler vardır. Giriş işlevlerinin otomatik yükleme ayarlarının yapıldığından emin olun ve paketleri yüklemek için init'te boş zamanlayıcıları başlatın . Bu isteğini undo-tree-mode, idove aslında bunları kullanmak gerekir zaman, onlar zaten yüklü olduğu için başkalarının ve asla bir gecikme fark.

    Güncelleme: kullanım paketi biraz değişti, zamanlayıcı özelliklerini kullanmaya başlamadan önce resmi benioku okuyun.

    Örneğin: yükleme işlemini biraz geciktirmek global-undo-tree-modeistiyorsanız, bunu kendi init'inize koyabilirsiniz:

    (run-with-idle-timer 1 nil (lambda () (global-undo-tree-mode t)))
    

    Artık initiniz mutlu bir şekilde devam edebilir ve global-undo-tree-modegerçekte her şey hazır olana ve direksiyon başında olana kadar aktif olmayacaktır.

    use-package: idle anahtar sözcüğünü kullanarak oluşturulmuş bu tür davranışları destekler. İşte undo-treebenim .init.el dosyasındaki config:

    (use-package undo-tree
      :idle (global-undo-tree-mode 1)
      :bind (("C-c j" . undo-tree-undo)
             ("C-c k" . undo-tree-redo)
             ("C-c l" . undo-tree-switch-branch)
             ("C-c ;" . undo-tree-visualize))
      :ensure t)
    
  • Kendi init'inizi profilini yapın, gerçek yavaşlamaların nerede olduğunu görmek her zaman şaşırtıcıdır. profile-dotemacs.el , ~ 6 saniyeden <1 saniyeye kadar initimi azaltmama yardımcı olmak için kullandığım inanılmaz bir araçtır.

İyi yapılandırılmış bir use-packageinit inanılmaz derecede hızlı olabilir. İnit'imi byte-derlemem ve use-package95 paketi yapılandırmak için kullanır ve <1 saniye içinde başlar.


7
“Girişinizi yapın, gerçek yavaşlamaların nerede olduğunu görmek her zaman şaşırtıcıdır.” Spoiler uyarısı, bu (require 'org)satır. :-)
Malabarba

@Jordan, giriş fonksiyonlarının otomatik kurulum ayarına sahip olmasını nasıl sağladığınızı biraz uzatır mısınız, sonra paketleri geri yüklemek için, özellikle ağaç-geri alma modu için boşta zamanlayıcıları başlatır mısın? Teşekkürler.
Francisco Dibar 17:14

@FranciscoDibar Gönderimi örneklerle güncelledim.
Jordon Biondo

2
Hemen ido-mode kullanıyorum, sxx için Cx Cf veya Mx, emacs açtığımda neredeyse her zaman ilk yaptığım şeydi ve hiçbir zaman bir sorun fark etmedim. Ayrıca eğer emacs açılışının bir saniyesinde bir şeyi geri almak istiyorsan ... Bu konuda söyleyecek hiçbir şeyim yok. Gerçekten endişeliyseniz, kendiniz deneyin ya da sadece boşta olmayan bir zamanlayıcı kullanın ya da init hook sonra.
Jordon Biondo

1
Boşta zamanlayıcı önerisi faydalıdır. Biraz daha kısa bir yükleme sözdizimi (run-with-idle-timer 1 nil #'global-undo-tree-mode)'. If the function you are loading takes parameters you can just provide them after the # '`komutudur.
Andrew Swann

8

Son zamanlarda emacs reddit'inde ortaya çıkan bir şey : init dosyanızın başına yakın bir yere koyarak çöp toplama çağrılarının sayısını azaltın:

(setq gc-cons-threshold 50000000)

(add-hook 'emacs-startup-hook 'my/set-gc-threshold)
(defun my/set-gc-threshold ()
  "Reset `gc-cons-threshold' to its default value."
  (setq gc-cons-threshold 800000))

Yukarıdaki örnekte, GC bol miktarda RAM içeren modern bir sistemde mantıklı görünen her ~ 50 MB (varsayılan yerine ~ 800kb) kullanılır.


1
Bu değer hariç (a) Muhtemelen ihtiyaç duyduğunuzdan çok daha yüksek (bunun onda biriyle bir fark görmüyorum); ve (b) başlangıçta devam ettirmek istediğiniz bir değer olmadığı açıktır, çünkü büyük bir GC eşiği, her GC olduğunda daha uzun gecikmelere eşittir. Onu init için yüksek olarak ayarladıysanız, initten sonra tekrar aşağıya doğru ayarlayın. Bence bunu emacs-startup-hookyapmak için iyi bir yer.
phils

1
@ philips Teşekkürler! (a) Kurulumumda, 50Mb minimum GC sayısını (ve minimum başlatma zamanını) verir. 10Mb'a kadar düşersem fark fark edilebilir / ölçülebilir (pratikte pek değişmese de ...) (b) iyi fikir, teşekkürler. Yorumunuzu yansıtacak şekilde yazıyı düzenledim.
ffevotte 15:15

6

Başlangıç ​​zamanınızı optimize etmek için harcadığınız zaman muhtemelen Emacs'ın başlamasını beklediğiniz tüm ekstra zamanlardan daha büyük olacaktır.

Şu anda requireinit dosyamda 25 çağrı yapıyorum, böylece Flycheck kodumda yazım hatalarını bulabiliyor. Başlangıç ​​zamanım ...

$ time emacs --eval '(save-buffers-kill-terminal)'

real    0m2.776s
user    0m2.305s
sys     0m0.148s

Ayrıca, sistemimde time emacs -Q --eval '(save-buffers-kill-terminal)'bir tane realvar 0m0.404s. Kazanabileceğim teorik maksimum süre 2.3 saniyedir.

Bir saatimi init dosyama tüm optimizasyonları yapmak için harcadığımı söyle. (Init dosyamın byte-derlenmiş olması nedeniyle değişikliklerimin neden etkili olmadığını öğrenmek için daha sonraki bir tarihte harcadığınız ilave 15-30 dakikayı saymayacağım.) (Ayrıca saati saymayacağım.) Çağrıları kaldırmasaydım Flycheck beni hata ayıklayıcısında kurtarırdı require.) Bir saatte 3600 saniye vardı, bu yüzden bütün 2.3 saniyeyi kurtarmayı başarırsam, zamana yaptığım yatırım ancak 1565 başlangıçtan sonra işe yaradı.

Emacs'ı günde 3 kez yeniden başlattığımı varsayarsak, her gün bu yatırımın karşılığını alması bir buçuk yıl alır. Aynı Emacs örneğini günlerce (çoğu zaman yaptığım gibi) bir gün boyunca çalıştırırsam, muhtemelen haftada sadece 2-5 kez yeniden başlatırım, bu durumda bu yatırımın karşılığını alması 6 ila 15 yıl alır.

Cömert davranıyorum, çünkü başlangıçlarınızı optimize etmek için bir saatten fazla zaman harcıyorsunuz ve muhtemelen maksimum teorik saniye sayısını kaydetmiyorsunuz.


12
Ama potansiyel olarak daha mutlu olacaksın.
phils

2
Bir kişi için bu doğru olabilir, ancak StackExchange'in bütün amacı paylaşımla ilgilidir. Bir kişinin bulması 30 dakika süren, ancak düzinelerce insanın başlama zamanından 1 saniye sonra kesilen bir numaraya ne dersiniz? Hala kötü bir yatırım olduğunu düşünür müsün?
ffevotte 14:15

@phils İronik olarak, aynı şeyi söylemeyi düşünmüştüm, ama kendi bakış açımı destekliyorum! “Başlangıç ​​zamanınız hakkında inlemeden önce kendinize düşünün, 'Bunu optimize etmek için zaman kaybetmediğim için mutluyum!'”
Jackson

@Francesco Ve bu yazı benim düzinelerce insana zaman kazandıran numaradır.
Jackson

@ Jackson, bu konuda hala sizinle aynı fikirde değilim, ancak en azından şimdi amacınızı anlıyorum. Thanks :)
ffevotte 14:15
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.