Почему (точка-мин) гораздо популярнее, чем 1?


16

Я искал по всем файлам Emacs Lisp в репозитории Emacs Git, и обнаружил, что это (goto-char (point-min))происходит 3621 раз и (goto-char 1)происходит 31 раз. Лично я вижу много, (point-min)но ни одного 1, даже во многих случаях, он на 100% уверен, что регион не сужен. Итак, вот мой вопрос: (point-min)все еще предпочтительнее, чем 1даже в не суженном буфере?

Я думаю, 1это быстрее, чем (point-min), неважно, насколько это мало, потому что 1является постоянным, в то время (point-min)как вызов функции. Кроме того, 1намного короче (point-min), 1 символ против 11 символов.


2
Можете ли вы привести пример, когда «на 100% уверен, что регион не сужен»? Я полагаю, вы имеете в виду сразу после расширения? Это действительно «много случаев»?
Омар

1
Я всегда думал, что буфер начинается в 0 ...
Омаир Маджид

Ответы:


28

Откуда ты знаешь, что буфер не сужен?

Если вы не расширили его непосредственно перед вызовом функции, вы не можете быть уверены. Более того, «отличное программное обеспечение» часто определяется как «используемое способами, которые автор никогда не предполагал» - поэтому всегда следует быть готовым к необычному использованию своего кода.

Читаемость кода - король

Когда вы пишете (goto-char 1), человек, читающий код (включая вас через 6 месяцев), будет тратить драгоценные мысли

  • "откуда мы знаем, что буфер не сужен?" и
  • "первый символ 0 или 1?"

По сути, если у вас нет (widen)прав, вам нужен комментарий, объясняющий, почему вы уверены, что буфер не сужен.

Стоимость тривиальна

Если вы не профилировали свой код и не нашли иное, можно предположить, что стоимость здесь будет тривиальной. По сравнению со всем остальным, что делает ELisp (сеть, доступ к диску, даже сопоставление строк), (point-min)не будет иметь значительных затрат (и может быть даже дешевле , см. Ответ Стефана).


2
+1, особенно для подчеркивания возможности использования неожиданным образом и возможного повторного использования в других контекстах. Используемая функция, point-minкак правило, является более общей, чем та, которая использует 1- она ​​обычно может работать независимо от того, сужена ли область.
Дрю

19

Чтобы дополнить ответ SDS (с которым я полностью согласен), несмотря на внешность, (point-min) может быть эффективнее, чем 1. С точки зрения скорости выполнения мои тесты не видят какой-либо ощутимой разницы, но с точки зрения размера:

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> 

Это потому, что он point-minимеет свой собственный байт-код и, следовательно, кодируется и выполняется очень эффективно по сравнению с другими вызовами функций.

Конечно, еще одна причина для меня point-minзаключается в том, что я считаю, что исторический выбор 1был ошибкой (буферы должны были начинаться с 0).


1
Причина, по которой вы указываете, состоит лишь в том, что байт-код point-minнемного меньше? Похоже, довольно ничтожная причина. Зачем придавать этому значение? Или, может быть, ваш ответ на самом деле был задуман как комментарий , чтобы просто исправить предположение, что один является более производительным, чем другой, или это 1приводит к меньшему байтовому коду?
Дрю
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.