Odkryłem, że używam -v
flagi coraz rzadziej (szczególnie w przypadku trywialnych rzeczy, takich jak tar
i 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 -v
flagi.
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?
tar xvf file.tar > /dev/null
vstar xf file.tar
? Przekierowanie do/dev/null
powinno wyeliminować z tego twój terminal.stdout
istderr
są buforowane liniowo - co oznacza, że zapełnianie buforów nie trwa tak długo - to blokowanieprintf
wywołań (i przez wyjście terminala wewnętrznego) trwa wiecznie.Odpowiedzi:
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ą
time
programu 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.
źródło
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.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.
źródło
Wykorzystując
yes
jako 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
yes
przez 5 sekund, w jednym przypadku wydrukowałem wyjście do terminala i zapisałem go do pliku (ztee
), w innym przypadku robię to samo, z wyjątkiem przekierowaniastdout
do/dev/null
:yes | tee yeslog_term & sleep 5 && killall yes && wc -l yeslog_term
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
yes
w połączeniu ztee
tutaj, 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
yes
podczas wysyłania do terminala, terminal zużywa około 100% procesora iyes
tylko około 37%, podczas gdyyes
bez wyjścia do terminala używa pełnego 100% (To jest na wielu maszyna podstawowa, więcyes
mogłaby użyć więcej procesora, gdyby była w stanie, z wyjątkiem tego, że został spowolniony przez terminal).źródło
Ł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.
źródło
printf()
jest niesamowicie drogiPeł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ę :)
źródło