Eu procurei em todos os arquivos do Emacs Lisp no repo do Emacs Git e encontrei (goto-char (point-min))
ocorre 3621 vezes e (goto-char 1)
ocorre 31 vezes. Pessoalmente, vejo muitos, (point-min)
mas nenhum 1
, mesmo em muitos casos, é 100% certo de que a região não é reduzida. Então, aqui está a minha pergunta: (point-min)
ainda é preferido do que 1
mesmo no buffer não estreitado?
Eu acho que 1
é mais rápido do que (point-min)
, por menor que seja, porque 1
é constante enquanto (point-min)
é uma chamada de função. Além disso, 1
é muito menor do que (point-min)
1 caractere vs 11 caracteres.
Respostas:
Como você sabe que o buffer não é reduzido?
A menos que você o tenha ampliado antes de chamar a função, você não pode ter certeza. Além disso, "ótimo software" é frequentemente definido como "sendo usado de maneiras que o autor nunca imaginou" - portanto, deve-se estar sempre preparado para o uso incomum de seu código.
A legibilidade do código é o rei
Quando você escreve
(goto-char 1)
, a pessoa que lê o código (incluindo você 6 meses depois) gasta preciosos recursos intelectuais pensandoBasicamente, a menos que você tenha feito
(widen)
isso antes, você precisa de um comentário explicando por que está confiante de que o buffer não é reduzido.O custo é trivial
A menos que você tenha perfilado seu código e encontrado o contrário, uma suposição segura é que o custo aqui será trivial. Comparado a todas as outras coisas que o ELisp faz (rede, acesso ao disco e até correspondência de cadeias),
(point-min)
não terá um custo significativo (e pode até ser mais barato , veja a resposta de Stefan).fonte
point-min
normalmente é mais geral do que uma que usa1
- normalmente pode funcionar se a região é reduzida ou não.Para complementar a resposta do sds (com a qual concordo plenamente), apesar das aparências,
(point-min)
pode ser mais eficiente do que1
. Em termos de velocidade de execução, meus testes não veem nenhuma diferença mensurável, mas em termos de tamanho:Isso
point-min
ocorre porque possui seu próprio código de bytes e, portanto, é codificado e executado com muita eficiência em comparação com outras chamadas de função.Obviamente, outro motivo para eu usar
point-min
é que considero a escolha histórica1
um erro (os buffers deveriam ter começado em 0).fonte
point-min
é um pouco menor? Parece uma razão bastante insignificante. Por que atribuir importância a isso? Ou talvez sua resposta tenha realmente sido um comentário , apenas para corrigir a suposição de que um é mais eficiente que o outro ou que1
resulta em um código de bytes menor?