Jaki efekt ma opcja „-d” z diff?

24

diffRealizacja w OpenBSD ma niestandardową -dopcję z następującej dokumentacji:

-d

Staraj się bardzo ciężko wyprodukować różnicę tak małą, jak to możliwe. Może to zużywać dużo mocy obliczeniowej i pamięci podczas przetwarzania dużych plików z wieloma zmianami.

diffImplementacja GNU ma tę samą opcję z krótszą dokumentacją

-d, --minimal

staraj się znaleźć mniejszy zestaw zmian

Od czasu do czasu korzystałem z tej opcji, aby sprawdzić, czy generuje dane wyjściowe, które są w dowolnym kształcie lub w innej formie niż to samo diffpolecenie bez opcji, ale nigdy nie widziałem żadnej różnicy (nie ma zamiaru grać słów).

Czy ktoś może podać lub wskazać przykład, w którym ta opcja faktycznie daje inny wynik niż to samo polecenie bez -d? Alternatywnie, jeśli ktoś mógłby wyjaśnić okoliczności wymagane do uruchomienia tej opcji. Nie jestem również pewien, czy „minimalny” oznacza „mniej linii wyjściowych” czy „mniej kawałków”.

Niewykształcone przypuszczenie, że ma to związek z bardzo dużymi kawałkami mięsa.

Kusalananda
źródło
1
unix.stackexchange.com/questions/472528 wzbudził twoją ciekawość, prawda? (-:
JdeBP
@JdeBP Tak, rzeczywiście. Przypomniało mi to tę flagę i fakt, że po prostu nie wiem, co robi, ponieważ nigdy nie widziałem, żeby coś robiła.
Kusalananda
1
info diff performancewyjaśnia to IIRC
Stéphane Chazelas
1
Wyraźnie powiązane . Niestety nie ma żadnego przykładu z myers -> minimalne wyniki.
Izaak
1
Naprawdę chciałbym uzyskać przykład, który stworzyłby inne dane wyjściowe gdiff -d, aby sprawdzić, czy dodatki do OpenBSD są przydatne. Z moich testów nie mogłem dostrzec żadnych różnic, ale oczywiste jest, że kod OpenBSD spowalnia wydajność, co wygląda na znaczący wpływ, ponieważ algorytm różnicowy z Douglasa McIlroya jest szybszy niż gdiff, o ile używasz normalnych rozmiarów plików.
schily

Odpowiedzi:

15

W GNU diff, również używanym we FreeBSD, --minimalflaga wyzwala wariację algorytmu Paula Eggerta, która powoduje, że „ogranicza koszt do O(N**1.5 log N)ceny produkcji nieoptymalnej wydajności dla dużych nakładów z różnicami”. Mówiąc dokładniej, powoduje to, że nie stosuje on kilku heurystyk, które zajmują się znajdowaniem zaledwie zbliżonych do optymalnych rozwiązań i wyrzucaniem „mylących” linii jako dodatkowych różnic.

OpenBSD diff, w którym stosuje się starsze Unix diffalgorytm z 1970, algorytm stosowany jest kredytowany Harold Stone'a flaga powoduje wyszukiwania, który jest skuteczny (UN) ograniczony przez wartość maksymalnie liczba całkowita bez znaku, a nie przez pierwiastek kwadratowy wielkości zakresu porównywanych linii (lub 256, jeśli jest większa).--minimal

Dalsza lektura

JdeBP
źródło
1
Kiedy stworzyłem lepszą różnicę ze źródeł UNIX, sprawdziłem to rozszerzenie OpenBSD i nie mogłem znaleźć lepszych wyników. Zauważ, że oryginalna funkcja stone () używa: `} while ((y = b [++ j])> 0);` i BTW: dla normalnych rozmiarów plików mój ulepszony plik różnicowy UNIX jest szybszy niż plik różnicowy GNU.
schily,