Busqué en todos los archivos Emacs Lisp en Emacs Git repo, y encontré que (goto-char (point-min))
ocurre 3621 veces y (goto-char 1)
ocurre 31 veces. Personalmente, veo muchos (point-min)
pero ninguno 1
, incluso en muchos casos, es 100% seguro de que la región no se ha reducido. Así que aquí está mi pregunta: ¿ (point-min)
todavía se prefiere que 1
incluso en un búfer no reducido?
Supongo que 1
es más rápido que (point-min)
, no importa cuán leve sea, porque 1
es constante mientras que (point-min)
es una llamada de función. Además, 1
es mucho más corto que (point-min)
1 carácter frente a 11 caracteres.
Respuestas:
¿Cómo sabes que el búfer no se reduce?
A menos que lo haya ampliado justo antes de llamar a la función, no puede estar seguro. Además, el "gran software" a menudo se define como "ser utilizado de maneras que el autor nunca imaginó", por lo que uno siempre debe estar preparado para el uso inusual del código.
La legibilidad del código es el rey
Cuando escribes
(goto-char 1)
, la persona que lee el código (incluyéndote a ti 6 meses después) gastará una preciosa capacidad mental pensandoBásicamente, a menos que tenga
(widen)
derecho antes, necesita un comentario que explique por qué está seguro de que el búfer no se reduce.El costo es trivial.
A menos que haya perfilado su código y haya encontrado lo contrario, una suposición segura es que el costo aquí será trivial. En comparación con todas las otras cosas que hace ELisp (red, acceso a disco, incluso coincidencia de cadenas),
(point-min)
no tendrá un costo significativo (e incluso podría ser más barato , vea la respuesta de Stefan).fuente
point-min
es generalmente más general que una que usa1
: por lo general, puede funcionar si la región se reduce o no.Para complementar la respuesta de sds (con lo que estoy totalmente de acuerdo), a pesar de las apariencias,
(point-min)
puede ser más eficiente que1
. En términos de velocidad de ejecución, mis pruebas no ven ninguna diferencia medible, pero en términos de tamaño:Esto se debe a que
point-min
tiene su propio código de bytes y, por lo tanto, está codificado y ejecutado de manera muy eficiente en comparación con otras llamadas a funciones.Por supuesto, otra razón para usar
point-min
es que considero que la elección histórica1
es un error (los buffers deberían haber comenzado en 0).fuente
point-min
es ligeramente más pequeño? Parece una razón muy miserable. ¿Por qué darle importancia a eso? ¿O tal vez su respuesta fue realmente como un comentario , solo para corregir la suposición de que uno es más eficiente que el otro o que1
da como resultado un código de byte más pequeño?