Czy pełne wykonywanie poleceń powoduje ich spowolnienie?


37

Odkryłem, że używam -vflagi coraz rzadziej (szczególnie w przypadku trywialnych rzeczy, takich jak tari cp). Jednak kiedy to zrobiłem i, powiedzmy, rozpakowywałem duży plik, zajęłoby to więcej czasu niż wtedy, gdy nie użyłem -vflagi.

Zakładam, że dzieje się tak, ponieważ terminal musi przetworzyć tekst i zapełniam bufor, który może mieć. Ale moje pytanie brzmi: czy to powoduje, że aplikacja faktycznie działa wolniej, czy też kończy się w tym samym czasie i to, co widzę, to terminal próbuje nadrobić zaległości?


Próbowałaś do czasu np tar xvf file.tar > /dev/nullvs tar xf file.tar? Przekierowanie do /dev/nullpowinno wyeliminować z tego twój terminal.
Benjamin Bannier,

3
Zauważ też, że stdouti stderrbuforowane liniowo - co oznacza, że ​​zapełnianie buforów nie trwa tak długo - to blokowanie printfwywołań (i przez wyjście terminala wewnętrznego) trwa wiecznie.
new123456

1
Gdybyście mówili o poleceniach systemu Windows, z pewnością powiedziałbym, że to prawda :)
kokbira

W przypadku zadań intensywnie korzystających z procesora, w zależności od tego, ile robisz we / wy, możesz zaobserwować straszne pogorszenie wydajności.
użytkownik

Odpowiedzi:


31

Tak, pełne gadżety spowolnią twoje aplikacje.

Ile zależy od aplikacji.

Każdy wydruk do terminala będzie wymagał dodatkowego czasu przetwarzania. W przypadku użycia printf () lub dowolnej z jego sióstr, jest to dość marnowane przetwarzanie.

Ponadto terminal ma do czynienia z tymi danymi. Pomiędzy aplikacją a terminalem jest ograniczona ilość miejsca w buforze, a kanał IO będzie blokował się, dopóki we wspomnianym buforze nie będzie wystarczającej ilości miejsca, aby faktycznie wyprowadzić dane. Aplikacja zazwyczaj nie będzie mogła kontynuować działania podczas blokowania. 1

Również wyświetlanie tekstu debugowania na terminalu pochłonie cykle przetwarzania. Znowu zależy to zarówno od aplikacji (ilość debugowania), programu terminalowego (użyte czcionki, efekty itp.), A nawet od używanego sterownika X Windows (przyspieszenie sprzętowe itp.).

Za pomocą timeprogramu można dość dokładnie określić, ile czasu zajęło wykonanie polecenia. Uruchamianie tego samego programu dwa razy w czasie, raz z debugowaniem, a raz bez, pokaże, ile to robi różnicy. Sugeruję uruchomienie polecenia przed wykonaniem testów, aby upewnić się, że buforowanie jest takie samo dla obu uruchomień testowych polecenia. Nie chcesz wypaczać wyników, ponieważ drugi przebieg przebiega znacznie szybciej, ponieważ większość danych została buforowana przy pierwszym uruchomieniu, czy teraz ...


1 W przypadku aplikacji wielowątkowej blokuje się tylko wątek wykonujący dane wyjściowe debugowania.


Większość programistów uczy się tego dość szybko (Borland C w DOS);)
Dragos

Oczywiście, jeśli okno konsoli jest ukryte (lub nawet częściowo zakryte), nie wpłynie to prawie tak bardzo, jak gdy konsola jest widoczna. Otwórz wiersz polecenia i wykonaj dir c:\/s/a. Możesz zobaczyć zmianę prędkości, gdy jest ona całkowicie widoczna i częściowo zakryta. Po zminimalizowaniu nie widzisz, że przyspiesza, ale jest zdecydowanie szybszy, ale jeśli chcesz przetestować, musisz zrestartować komputer, aby ominąć buforowanie, które spowodowałoby, że i tak byłoby szybsze, ponieważ nie miałoby aby uzyskać dostęp do dysku.
Synetech,

1
@Syn Mówimy tutaj o Linuksie.
Majenko,

1
@Matt to wciąż poprawny komentarz. Prosimy o szacunek.
nhinkle

@Matt, doh! Nie zauważyłem. (Być może odwróciłem uwagę od komentarza DOS.) W każdym razie Linux jest zupełnie inny, ale zastanawiam się, czy to samo dotyczy go (widoczne konsole z dużą ilością przewijania tekstu działają wolniej).
Synetech,

8

To zależy od uruchomionej aplikacji. Jednak ogólnie rzecz biorąc, możemy powiedzieć, że pełne spowolnienie większości popularnych aplikacji Linux, ponieważ muszą zsynchronizować swoje działania między standardowym wyjściem a we / wy lub granicami procesora.


6

Wykorzystując yesjako przypadek testowy w systemie OS X 10.7, wydaje się, że naprawdę ważne jest, aby wydrukować dużo danych wyjściowych na terminalu, jak można by się spodziewać.

Uściślając to nieco dalej, biegnąłem yesprzez 5 sekund, w jednym przypadku wydrukowałem wyjście do terminala i zapisałem go do pliku (z tee), w innym przypadku robię to samo, z wyjątkiem przekierowania stdoutdo /dev/null:

  1. yes | tee yeslog_term & sleep 5 && killall yes && wc -l yeslog_term
  2. yes | tee yeslog_noterm > /dev/null & sleep 5 && killall yes && wc -l yeslog_noterm

Przypadek 1. daje 2371584 wierszy, a przypadek 2. daje 136421376 wierszy, czyli 57 razy więcej. „Wydajność” yes(mierzona liczbą linii drukowanych w jednostce czasu) jest w tym przypadku 57 razy wolniejsza .

Jedna uwaga tutaj jest taka, że ​​użyłem yesw połączeniu z teetutaj, co może nieznacznie wpłynąć na wyniki, ale myślę, że wyniki są nadal aktualne.

Innym wskazaniem, że program jest spowolniony, jest to, że działa yespodczas wysyłania do terminala, terminal zużywa około 100% procesora i yestylko około 37%, podczas gdy yesbez wyjścia do terminala używa pełnego 100% (To jest na wielu maszyna podstawowa, więc yesmogłaby użyć więcej procesora, gdyby była w stanie, z wyjątkiem tego, że został spowolniony przez terminal).


5

Łatwo jest odpowiedzieć tak, spowolni to aplikację. Ale o wiele bardziej prawdziwa odpowiedź jest taka, że nie będzie to miało znaczenia w 99% przypadków.

Jeśli twoja aplikacja wykonuje jakąkolwiek pracę, która faktycznie wymaga trochę mocy procesora, szanse na wydrukowanie dodatkowych linii tekstu na ekranie bez względu na różnicę są bliskie 0%.

W rzeczywistości możesz łatwo dokonać własnego osądu: jeśli aplikacja wyrzuca ogromną ścianę tekstu, może cię to trochę kosztować. Może.


3
-1 to po prostu nieprawda. printf()jest niesamowicie drogi
Thomas Bonini

1
To, co powiedziałem, było prawdą. To, co próbujesz zrobić, aby wyglądało tak, jak powiedziałem, to jednak coś zupełnie innego. Nie mówię nic o wydajności żadnego konkretnego drukowania stdlib. Mówię, że programy powinny wykonywać wystarczająco dużo pracy, aby czas spędzony na drukowaniu był znikomy. Teraz idź trollować kogoś innego.
slarpspark

@slarpspark: niekoniecznie jest to nieistotne, nawet jeśli weźmiemy printf () z równania, strumień bajtów wciąż musi przejść przez bash, następnie emulator terminala, a następnie emulator terminala musiał wyrenderować tekst na ekranie po przeanalizowaniu znaków specjalnych i renderowanie tekstu nie jest tanie, jeśli jest wykonywane z szybkością, jaką mogą wykonywać niektóre pełne polecenia; i byłoby szczególnie drogie, gdyby program opróżniał bufor wyjściowy w każdej linii, ponieważ oznacza to przełączanie kontekstu. Podczas pisania skryptów Pythona często zdarza mi się, że usuwanie wydruków w ciasnej pętli może czasem doprowadzić 10 do 1.
Lie Ryan,

Co powiesz na polecenie działające w SSH, a nawet jeśli czas procesora jest minimalny, to po wprowadzeniu opóźnienia sieci z pewnością jest to znaczące?
ec2011

3

Pełny kod jest zwykle oceniany za pomocą instrukcji if i za każdym razem, gdy przekazuje kontrolę do funkcji wyświetlania, im dłużej to trwa, kontekst może się przełączać, więcej przerwań.

Ale to zależy, jeśli pełny kod jest osobnym wątkiem, który tylko od czasu do czasu sprawdza stan ukończenia, różnica jest pomijalna.

To pytanie może wiele skorzystać z wkładu doświadczonych programistów w stackoverflow. Sugeruję przeprowadzkę :)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.