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ż 1
nawet w nie zawężonym buforze?
Myślę, że 1
jest szybszy niż (point-min)
, bez względu na to, jak niewielki jest, ponieważ 1
jest stały, podczas gdy (point-min)
jest wywołaniem funkcji. Poza tym 1
jest znacznie krótszy niż (point-min)
1 znak kontra 11 znaków.
Odpowiedzi:
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ślenieZasadniczo, 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).źródło
point-min
jest zazwyczaj bardziej ogólna niż ta, która używa1
- zazwyczaj może działać niezależnie od tego, czy region jest zawężony, czy nie.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:Jest tak, ponieważ
point-min
ma 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-min
jest to, że uważam historyczny wybór1
za błąd (bufory powinny zacząć się od 0).źródło
point-min
jest 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 że1
skutkuje mniejszym kodem bajtowym?