Dlaczego tar | tar jest znacznie szybszy niż cp?

10

Wydaje się, że rekurencyjne kopiowanie katalogu, użycie tardo spakowania katalogu, a następnie przesłanie danych wyjściowych do innego w tarcelu rozpakowania jest znacznie szybsze niż użycie cp -r(lub cp -a).

Dlaczego to? I dlaczego nie cpmożna przyspieszyć, robiąc to w ten sam sposób pod maską?

Edycja: Zauważyłem tę różnicę, próbując skopiować ogromną strukturę katalogów zawierającą dziesiątki tysięcy plików i folderów, głęboko zagnieżdżonych, ale o łącznej wielkości około 50 MB. Nie jestem pewien, czy to istotne.

kalus
źródło
To jedno interesujące pytanie. Odpowiedzi znajdziesz tutaj: stackoverflow.com/questions/316078 i tutaj: unix.stackexchange.com/questions/66647
Teresa e Junior

Odpowiedzi:

6

Cpwykonuje otwieranie-czytanie-zamykanie-otwieranie-zapisywanie-zamykanie w pętli nad wszystkimi plikami. Czytanie z jednego miejsca i pisanie do drugiego odbywa się w sposób całkowicie przeplatany. Tar|tarwykonuje odczytywanie i zapisywanie w osobnych procesach, a ponadto tarwykorzystuje wiele wątków do odczytywania (i zapisywania) kilku plików „jednocześnie”, skutecznie umożliwiając sterownikowi dysku pobieranie, buforowanie i przechowywanie wielu bloków danych jednocześnie. Podsumowując, tarpozwala każdemu komponentowi na wydajną pracę, jednocześnie cprozkładając problem na różne, nieefektywnie małe porcje.

Pum Walters
źródło
Czy naprawdę możemy powiedzieć, że dotyczy to wszystkich cpwdrożeń? Skąd wiemy, że to prawda? A dlaczego cpnapisano by w tak nieefektywny sposób? Każda implementacja podręcznika kopii pliku odczytuje bufor n bajtów naraz i zapisuje je na dysku przed odczytaniem kolejnych n bajtów. Ale mówisz, że cpzawsze czyta cały plik przed zapisaniem całej kopii?
LarsH