(Point-min) neden 1'den daha popüler?


16

Emacs Git deposundaki tüm Emacs Lisp dosyalarını araştırdım ve (goto-char (point-min))3621 kez ve (goto-char 1)31 kez gerçekleşti. Şahsen ben çok görüyorum (point-min)ama hiçbiri 1, hatta çoğu durumda, bölgenin daralmadığından% 100 emin. İşte benim sorum: (point-min)hala 1daraltılmamış tamponda bile tercih ediliyor mu?

Sanırım 1daha hızlıdır (point-min), ne kadar hafif olduğunu görmüyorum, çünkü bir işlev çağrısı 1sabitken (point-min). Ayrıca, 1 karakter vs 11 karakter 1çok daha kısadır (point-min).


2
"Bölgenin daralmadığından% 100 emin" olduğu bir örnek verebilir misiniz? Sanırım genişletmeden hemen sonra kastediyor musunuz? Bu gerçekten "birçok vaka" mı?
Ömer

1
Ben her zaman tampon 0 başlar başlar ...
Omair Majid

Yanıtlar:


28

Tamponun daraltılmadığını nasıl anlarsınız?

İşlevi çağırmadan hemen önce genişletmediyseniz, emin olamazsınız. Dahası, "harika yazılım" genellikle "yazarın hiç düşünmediği şekillerde kullanılma" olarak tanımlanır - bu nedenle, kodun olağandışı kullanımına her zaman hazırlıklı olunmalıdır.

Kod okunabilirliği King

Eğer yazarken (goto-char 1), kod okuma kişi değerli beyin gücü düşünme geçirecek (6 ay sonra siz de dahil)

  • "Tamponun daraltılmadığını nasıl biliyoruz?" ve
  • "ilk karakter 0 veya 1 mi?"

Temel olarak, daha (widen)önce sahip değilseniz, arabellek neden daralmadığından emin olduğunuza dair bir yorum yapmanız gerekir.

Maliyet önemsiz

Kodunuzu oluşturup başka türlü bulamadığınız sürece, güvenli bir varsayım, buradaki maliyetin önemsiz olacağıdır. ELisp'in yaptığı tüm diğer şeylerle karşılaştırıldığında (ağ, disk erişimi, hatta dize eşleme) (point-min)anlamlı bir maliyete sahip olmayacaktır (ve hatta daha ucuz olabilir , Stefan'ın cevabına bakınız).


2
+1, özellikle beklenmedik şekillerde olası kullanımı ve diğer bağlamlarda olası yeniden kullanımları vurgulamak için. Kullanan bir işlev point-mintipik olarak kullanılandan daha geneldir 1- bölgenin daraltılmış olup olmadığı tipik olarak işe yarayabilir.
Drew

19

Görünüşe rağmen, sds'nin cevabını (tamamen kabul ettiğim) tamamlamak, (point-min)daha verimli olabilir 1. Yürütme hızı açısından, testlerim ölçülebilir bir fark görmüyor, ancak boyut açısından:

ELISP> (byte-compile '(lambda () (goto-char (point-min))))
#[nil "eb\207" [] 1]

ELISP> (byte-compile '(lambda () (goto-char 1)))
#[nil "\300b\207" [1] 1]

ELISP> 

Bunun nedeni point-min, kendi bayt koduna sahip olması ve dolayısıyla diğer işlev çağrılarıyla karşılaştırıldığında çok verimli bir şekilde kodlanmış ve yürütülmüş olmasıdır.

Tabii ki, kullanmamın bir başka nedeni point-minde tarihsel seçimin 1bir hata olduğunu düşünmemdir (tamponlar 0'dan başlamalıydı).


2
Verdiğiniz sebep sadece bayt kodunun point-minbiraz daha küçük olması mı? Güzel bir neden gibi görünüyor. Neden buna önem veriyorsunuz? Ya da belki cevabınız, birinden diğerinden daha fazla performans olduğu ya da daha küçük bayt koduyla sonuçlandığı varsayımını düzeltmek için gerçekten bir yorum olarak mı kastedilmiştir 1?
Drew
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.