Ich habe über alle Emacs Lisp-Dateien in Emacs Git repo gesucht und festgestellt, dass sie (goto-char (point-min))
3621-mal und (goto-char 1)
31-mal vorkommen. Persönlich sehe ich viele, (point-min)
aber keine 1
, auch in vielen Fällen ist 100% sicher, dass die Region nicht eingeengt ist. Also hier ist meine frage: ist (point-min)
noch vorzuziehen, 1
auch in nicht eingeengtem puffer?
Ich denke, es 1
ist schneller als (point-min)
, egal wie gering es ist, weil 1
es konstant ist, während (point-min)
es ein Funktionsaufruf ist. Außerdem 1
ist viel kürzer als (point-min)
1 Zeichen gegen 11 Zeichen.
Antworten:
Woher wissen Sie, dass der Puffer nicht verengt ist?
Sie können nicht sicher sein, ob Sie die Funktion direkt vor dem Aufruf erweitert haben. Darüber hinaus wird "großartige Software" häufig als "in einer Weise verwendet, wie der Autor es sich nie vorgestellt hat" definiert. Daher sollte man immer auf die ungewöhnliche Verwendung des eigenen Codes vorbereitet sein.
Die Lesbarkeit des Codes ist König
Wenn Sie schreiben
(goto-char 1)
, wird die Person, die den Code liest (einschließlich Sie 6 Monate später), wertvolle Denkarbeit leistenGrundsätzlich
(widen)
benötigen Sie einen Kommentar, der erklärt, warum Sie sicher sind, dass der Puffer nicht eingegrenzt wird, es sei denn, Sie haben direkt zuvor.Kosten sind trivial
Eine sichere Annahme ist, dass die Kosten hier geringfügig sind, es sei denn, Sie haben Ihr Code-Profil erstellt und etwas anderes festgestellt. Im Vergleich zu all den anderen Dingen, die ELisp macht (Netzwerk, Festplattenzugriff, sogar String-Matching),
(point-min)
wird dies keine bedeutenden Kosten verursachen (und möglicherweise sogar billiger sein , siehe Stefans Antwort).quelle
point-min
wird , ist in der Regel allgemeiner als eine, die verwendet wird.1
Sie kann in der Regel unabhängig davon funktionieren, ob die Region eingegrenzt ist oder nicht.Die Antwort von sds (der ich voll und ganz zustimme) zu ergänzen,
(point-min)
kann trotz des Auftretens effizienter sein als1
. In Bezug auf die Ausführungsgeschwindigkeit sehen meine Tests keinen messbaren Unterschied, aber in Bezug auf die Größe:Das liegt daran, dass
point-min
es einen eigenen Bytecode hat und daher im Vergleich zu anderen Funktionsaufrufen sehr effizient codiert und ausgeführt wird.Ein weiterer Grund für mich
point-min
ist natürlich, dass ich die historische Wahl für1
einen Fehler halte (Puffer sollten bei 0 beginnen).quelle
point-min
etwas kleiner ist? Scheint ein ziemlich dürftiger Grund zu sein. Warum darauf Wert legen? Oder war Ihre Antwort wirklich als Kommentar gedacht , um nur die Annahme zu korrigieren, dass einer performanter ist als der andere oder dass1
sich ein kleinerer Byte-Code ergibt?