Я искал по всем файлам 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 символов.
Ответы:
Откуда ты знаешь, что буфер не сужен?
Если вы не расширили его непосредственно перед вызовом функции, вы не можете быть уверены. Более того, «отличное программное обеспечение» часто определяется как «используемое способами, которые автор никогда не предполагал» - поэтому всегда следует быть готовым к необычному использованию своего кода.
Читаемость кода - король
Когда вы пишете
(goto-char 1)
, человек, читающий код (включая вас через 6 месяцев), будет тратить драгоценные мыслиПо сути, если у вас нет
(widen)
прав, вам нужен комментарий, объясняющий, почему вы уверены, что буфер не сужен.Стоимость тривиальна
Если вы не профилировали свой код и не нашли иное, можно предположить, что стоимость здесь будет тривиальной. По сравнению со всем остальным, что делает ELisp (сеть, доступ к диску, даже сопоставление строк),
(point-min)
не будет иметь значительных затрат (и может быть даже дешевле , см. Ответ Стефана).источник
point-min
как правило, является более общей, чем та, которая использует1
- она обычно может работать независимо от того, сужена ли область.Чтобы дополнить ответ SDS (с которым я полностью согласен), несмотря на внешность,
(point-min)
может быть эффективнее, чем1
. С точки зрения скорости выполнения мои тесты не видят какой-либо ощутимой разницы, но с точки зрения размера:Это потому, что он
point-min
имеет свой собственный байт-код и, следовательно, кодируется и выполняется очень эффективно по сравнению с другими вызовами функций.Конечно, еще одна причина для меня
point-min
заключается в том, что я считаю, что исторический выбор1
был ошибкой (буферы должны были начинаться с 0).источник
point-min
немного меньше? Похоже, довольно ничтожная причина. Зачем придавать этому значение? Или, может быть, ваш ответ на самом деле был задуман как комментарий , чтобы просто исправить предположение, что один является более производительным, чем другой, или это1
приводит к меньшему байтовому коду?