Wydaje się, że rekurencyjne kopiowanie katalogu, użycie tar
do spakowania katalogu, a następnie przesłanie danych wyjściowych do innego w tar
celu rozpakowania jest znacznie szybsze niż użycie cp -r
(lub cp -a
).
Dlaczego to? I dlaczego nie cp
moż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.
Odpowiedzi:
Cp
wykonuje 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|tar
wykonuje odczytywanie i zapisywanie w osobnych procesach, a ponadtotar
wykorzystuje 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,tar
pozwala każdemu komponentowi na wydajną pracę, jednocześniecp
rozkładając problem na różne, nieefektywnie małe porcje.źródło
cp
wdrożeń? Skąd wiemy, że to prawda? A dlaczegocp
napisano 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, żecp
zawsze czyta cały plik przed zapisaniem całej kopii?