A diff
implementação no OpenBSD possui uma -d
opção não padrão com a seguinte documentação:
-d
Tente muito produzir um diff o menor possível. Isso pode consumir muito poder de processamento e memória ao processar arquivos grandes com muitas alterações.
A diff
implementação GNU tem a mesma opção com a documentação mais curta
-d
,--minimal
tente encontrar um conjunto menor de alterações
De tempos em tempos, usei essa opção apenas para ver se ela gera uma saída de qualquer forma ou forma diferente do mesmo diff
comando sem a opção, mas nunca vi nenhuma diferença (sem trocadilhos).
Alguém poderia fornecer ou apontar para um exemplo em que essa opção realmente produz um resultado diferente do mesmo comando sem -d
? Como alternativa, se alguém puder explicar as circunstâncias necessárias para essa opção entrar em ação. Também não tenho certeza se "mínimo" significa "menos linhas de saída" ou "menos trechos".
Um palpite sem instrução é que isso tem a ver com grandes pedaços.
info diff performance
explicagdiff -d
para verificar se as adições ao OpenBSD são úteis. Nos meus testes, não consegui nenhuma diferença, mas é óbvio que o código do OpenBSD diminui o desempenho, o que parece ter um impacto significativo, pois o algoritmo diff de Douglas McIlroy é mais rápido que o gdiff, desde que você use tamanhos de arquivo normais.Respostas:
No GNU
diff
, também usado no FreeBSD, a--minimal
flag aciona uma variação do algoritmo de Paul Eggert que faz com que "limite o custo aoO(N**1.5 log N)
preço de produzir uma saída subótima para grandes entradas com diferenças". Mais especificamente, faz com que não aplique várias heurísticas que tratam de encontrar soluções meramente próximas das ótimas e de lançar linhas "confusas" como diferenças extras.No OpenBSD
diff
, que usa odiff
algoritmo Unix mais antigo da década de 1970, o algoritmo empregado é creditado a Harold Stone, e a--minimal
flag aciona uma pesquisa que é (efetivamente des-) limitada pelo valor máximo de um número inteiro não assinado em vez da raiz quadrada do tamanho do intervalo de linhas que está sendo comparado (ou 256, se for maior).Leitura adicional
fonte