¿Qué efecto tiene la opción "-d" con diff?

24

La diffimplementación en OpenBSD tiene una -dopción no estándar con la siguiente documentación:

-d

Esfuércese por producir una diferencia lo más pequeña posible. Esto puede consumir mucha potencia de procesamiento y memoria al procesar archivos grandes con muchos cambios.

La diffimplementación de GNU tiene la misma opción con la documentación más corta

-d, --minimal

esforzarse por encontrar un conjunto más pequeño de cambios

De vez en cuando he usado esta opción solo para ver si genera resultados que tienen cualquier forma o forma diferente del mismo diffcomando sin la opción, pero nunca he visto ninguna diferencia (sin juego de palabras).

¿Podría alguien proporcionar o señalar un ejemplo en el que esta opción realmente produzca un resultado diferente del mismo comando sin él -d? Alternativamente, si alguien pudiera explicar las circunstancias requeridas para que esta opción funcione. Tampoco estoy seguro de si "mínimo" significa "menos líneas de salida" o "menos trozos".

Una suposición sin educación es que tiene que ver con trozos muy grandes.

Kusalananda
fuente
1
unix.stackexchange.com/questions/472528 despertó tu curiosidad ¿verdad? (-:
JdeBP
@JdeBP Sí, de hecho. Me recordó esta bandera y el hecho de que simplemente no sé qué hace, ya que nunca la he visto hacer nada.
Kusalananda
1
info diff performancelo explica IIRC
Stéphane Chazelas
1
Claramente relacionado . Lamentablemente no hay ejemplos de myers -> resultados mínimos.
Isaac
1
Realmente me gustaría obtener un ejemplo que creara una salida diferente gdiff -dpara verificar si las adiciones a OpenBSD son útiles. De mis pruebas, no pude obtener ninguna diferencia, pero es obvio que el código de OpenBSD ralentiza el rendimiento, lo que parece un impacto significativo, ya que el Algoritmo de diferencia de Douglas McIlroy es más rápido que gdiff siempre que use tamaños de archivo normales.
schily

Respuestas:

15

En GNU diff, también utilizado en FreeBSD, el --minimalindicador desencadena una variación del algoritmo por Paul Eggert que hace que "limite el costo al O(N**1.5 log N)precio de producir una producción subóptima para entradas grandes con diferencias". Más específicamente, hace que no aplique varias heurísticas que tratan de encontrar soluciones meramente cercanas a las óptimas y de descartar líneas "confusas" como diferencias adicionales.

En OpenBSD diff, que utiliza el antiguo diffalgoritmo de Unix de la década de 1970, el algoritmo empleado se acredita a Harold Stone, y el --minimalindicador desencadena una búsqueda que está (efectivamente no) limitada por el valor máximo de un entero sin signo en lugar de por la raíz cuadrada del tamaño del rango de líneas que se compara (o 256 si es mayor).

Otras lecturas

JdeBP
fuente
1
Cuando creé una mejor diferencia de las fuentes de UNIX, verifiqué la mejora de OpenBSD y no pude encontrar mejores resultados. Tenga en cuenta que la función stone () original usa: `} while ((y = b [++ j])> 0);` y BTW: para tamaños de archivo normales, mi UNIX diff mejorado es más rápido que GNU diff.
schily