Dlaczego (punkt-minuta) jest znacznie bardziej popularny niż 1?

16

Przeszukałem wszystkie pliki Emacs Lisp w repozytorium Emacs Git i znalazłem (goto-char (point-min))3621 razy i (goto-char 1)31 razy. Osobiście widzę wiele, (point-min)ale nie ma 1, nawet w wielu przypadkach, to 100% pewność, że region nie jest zawężony. Oto moje pytanie: jest (point-min)nadal preferowane niż 1nawet w nie zawężonym buforze?

Myślę, że 1jest szybszy niż (point-min), bez względu na to, jak niewielki jest, ponieważ 1jest stały, podczas gdy (point-min)jest wywołaniem funkcji. Poza tym 1jest znacznie krótszy niż (point-min)1 znak kontra 11 znaków.

Xuchunyang
źródło
2
Czy możesz podać przykład, w którym „jest 100% pewny, że region nie jest zawężony”? Myślę, że masz na myśli natychmiast po poszerzeniu? Czy to naprawdę „wiele przypadków”?
Omar,
1
Zawsze myślałem, że bufor zaczyna się od 0 ...
Omair Majid

Odpowiedzi:

28

Skąd wiesz, że bufor nie jest zawężony?

O ile nie rozszerzysz go tuż przed wywołaniem funkcji, nie możesz być pewien. Co więcej, „wielkie oprogramowanie” jest często definiowane jako „używane w sposób, jakiego autor nigdy nie przewidział” - dlatego należy zawsze być przygotowanym na nietypowe użycie własnego kodu.

Czytelność kodu to King

Kiedy napiszesz (goto-char 1), osoba czytająca kod (w tym ty 6 miesięcy później) poświęci cenne myślenie

  • „skąd wiemy, że bufor nie jest zawężony?” i
  • „jest pierwszym znakiem 0 lub 1?”

Zasadniczo, chyba że masz to (widen)wcześniej, potrzebujesz komentarza wyjaśniającego, dlaczego masz pewność, że bufor nie jest zawężony.

Koszt jest trywialny

O ile nie profilowałeś kodu i nie znalazłeś inaczej, bezpiecznym założeniem jest to, że koszt tutaj będzie trywialny. W porównaniu do wszystkich innych rzeczy, które robi ELisp (sieć, dostęp do dysku, a nawet dopasowanie ciągów), (point-min)nie będzie miał znaczących kosztów (i może być nawet tańszy , patrz odpowiedź Stefana).

sds
źródło
2
+1, szczególnie dla podkreślenia możliwości użycia w nieoczekiwany sposób i ponownego użycia w innych kontekstach. Funkcja, która używa, point-minjest zazwyczaj bardziej ogólna niż ta, która używa 1- zazwyczaj może działać niezależnie od tego, czy region jest zawężony, czy nie.
Drew
19

Uzupełnienie odpowiedzi sds (z którą w pełni się zgadzam), pomimo pozorów, (point-min)może być bardziej wydajne niż 1. Jeśli chodzi o szybkość wykonywania, moje testy nie dostrzegają żadnej mierzalnej różnicy, ale pod względem wielkości:

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> 

Jest tak, ponieważ point-minma swój własny kod bajtowy, a zatem jest kodowany i wykonywany bardzo skutecznie w porównaniu do innych wywołań funkcji.

Oczywiście, innym powodem, dla którego mam to użyć, point-minjest to, że uważam historyczny wybór 1za błąd (bufory powinny zacząć się od 0).

Stefan
źródło
2
Powodem jest to, że kod bajtu point-minjest nieco mniejszy? Wydaje się to dość marnym powodem. Po co przywiązywać do tego wagę? A może twoja odpowiedź naprawdę miała być komentarzem , po prostu skorygować założenie, że jeden jest bardziej wydajny od drugiego lub że 1skutkuje mniejszym kodem bajtowym?
Drew