명령을 자세하게 실행하면 속도가 느려 집니까?


37

나는 -v많은 응용 프로그램에 대해 플래그를 사용하는 것을 발견했습니다 (특히 tarand 같은 사소한 것들 cp). 그러나 큰 파일을 압축 해제하면 -v플래그를 사용하지 않을 때보 다 시간이 오래 걸립니다 .

터미널이 텍스트를 처리해야하기 때문에 버퍼가 무엇이든 채우고 있다고 가정합니다. 그러나 내 질문은 응용 프로그램이 실제로 느리게 실행되거나 동일한 시간 내에 완료됩니까? 그리고 내가보고있는 것은 터미널이 따라 잡으려고합니까?


당신은 예를 들어 시간을 시도해 봤어 tar xvf file.tar > /dev/nulltar xf file.tar? 로 리디렉션하면 /dev/null터미널에서 터미널을 꺼내야합니다.
Benjamin

3
또한, 참고 stdout하고 stderr있는 라인 버퍼 - 버퍼를 채우는 것은 그렇게 오래 걸리지 않습니다 것을 의미한다 -는 차단의 printf전화를 (그리고 확장 단자 출력하여)이 영원히합니다.
new123456

1
Windows 명령에 대해 이야기했다면, 그것이 사실이라고 확실히 말할 것입니다. :)
kokbira

CPU를 많이 사용하는 작업의 경우 IO의 양에 따라 성능이 크게 저하 될 수 있습니다.
사용자

답변:


31

예, 상세를 실행하면 응용 프로그램 속도가 느려집니다.

응용 프로그램에 따라 다릅니다.

터미널로 인쇄 할 때마다 추가 처리 시간이 필요합니다. printf () 또는 그 자매를 사용하는 경우 이것은 상당히 많은 양의 처리 낭비입니다.

또한 터미널은 해당 데이터를 처리해야합니다. 어플리케이션과 터미널 사이에 제한된 양의 버퍼 공간이 있으며, IO 채널은 실제로 버퍼에 데이터를 출력하기에 충분한 공간이있을 때까지 차단됩니다. 이 차단이 진행되는 동안 일반적으로 응용 프로그램을 계속 사용할 수 없습니다. 1

또한 터미널에 디버깅 텍스트를 표시하는 작업은 처리주기를 소비합니다. 다시 말하지만 이것은 응용 프로그램 (디버깅 수량), 터미널 프로그램 (사용 된 글꼴, 효과 등) 및 사용중인 X 윈도우 드라이버 (하드웨어 가속 등)에 따라 다릅니다.

time프로그램은 명령 실행 시간을 상당히 정확하게 결정하는 데 사용될 수 있습니다. 같은 프로그램을 두 번, 두 번, 한 번은 디버깅하고 한 번은 실행하지 않으면 얼마나 큰 차이가 있는지 보여줍니다. 테스트를 수행하기 전에 명령을 한 번 실행하여 캐싱이 명령의 두 테스트 실행 모두에 대해 동일한 지 확인하십시오. 대부분의 데이터가 첫 번째 실행에 의해 캐시되었으므로 두 번째 실행이 훨씬 빨라져 결과가 왜곡되는 것을 원하지 않습니다.


1 다중 스레드 응용 프로그램의 경우 디버깅 출력을 수행하는 스레드 만 실제로 차단됩니다.


대부분의 프로그래머는 이것을 매우 빠르게 배웁니다 (DOS의 Borland C);)
Dragos

물론 콘솔 창이 숨겨져 있거나 부분적으로 덮여 있으면 콘솔이 표시 될 때만 큼 영향을 미치지 않습니다. 명령 프롬프트를 열고를 수행하십시오 dir c:\/s/a. 속도가 완전히 보이고 부분적으로 커버 될 때 속도 변화를 볼 수 있습니다. 최소화 할 때 속도가 빨라지 는 것을 수는 없지만 테스트를 원한다면 재부팅해야하지만 캐싱을 우회하여 어쨌든 더 빠를 수있는 캐싱을 우회해야합니다. 디스크에 액세스합니다.
Synetech

1
@Syn 여기서 리눅스를 이야기하고 있습니다.
Majenko

1
@Matt 여전히 유효한 의견입니다. 존중하십시오.
닌클

@ 매트! 나는 몰랐다. 어쨌든 리눅스는 상당히 다르지만, 동일한 텍스트가 적용되는지 궁금합니다 (많은 텍스트 스크롤이 느리게 실행되는 보이는 콘솔).
Synetech

8

실행중인 응용 프로그램에 따라 다릅니다. 그러나 일반적으로 verbose는 대부분의 일반적인 Linux 응용 프로그램이 stdout과 I / O 또는 프로세서 범위 간의 작업을 동기화해야하므로 속도가 느려질 수 있다고 말할 수 있습니다.


6

yesOS X 10.7에서 테스트 케이스로 사용 하면 실제로 많은 출력을 터미널에 인쇄하는 것이 중요합니다.

좀 더 이것을 정량화 나는 달렸다 yes단자에 출력을 인쇄 (갖는 파일에 저장 한 경우, 5 초 tee리디렉션 이외에는 동일하고 다른 경우) stdout/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

사례 1은 2371584 라인을 제공 하고 사례 2는 136421376 라인 또는 57 배를 제공합니다. yes이 경우 (단위 시간당 인쇄되는 라인의 양으로 측정 된) '성능'은 57 배 느립니다 .

여기서 한 가지 참고 사항은 여기 yes와 함께 사용 tee하여 결과에 약간 영향을 줄 수 있지만 결과가 여전히 유효하다고 생각합니다.

프로그램 속도가 느려 졌다는 또 다른 증거 yes는 터미널로 출력 하는 동안 실행 하면 터미널은 약 100 % CPU를 사용하고 yes약 37 % 만 yes사용하고 터미널로 출력하지 않고 실행 하면 전체 100 %를 사용한다는 것입니다. 코어 머신이므로 yes가능하면 더 많은 CPU를 사용할 수 있습니다 (단말기에 의해 속도가 느려진 것을 제외하고).


5

예라고 대답하기 쉽습니다. 응용 프로그램 속도가 느려집니다. 그러나 훨씬 더 진정한 대답은 99 %의 사례에서는 중요하지 않다는 것입니다.

응용 프로그램이 실제로 어떤 CPU 전력 소요 작품의 어떤 종류의 일을하는 경우, 만들기 화면에 텍스트의 일부 여분의 라인을 인쇄하는 기회 어떤 차이의 종류는 가까운 0 %이다.

실제로, 당신은 쉽게 당신 자신의 판단을 할 수 있습니다 : 응용 프로그램이 거대한 텍스트 벽을 뿜어 내면, 실제로 약간의 비용이들 수 있습니다. 아마도.


3
-1 이것은 사실이 아닙니다. printf()미친 듯이 비싼
토마스 Bonini

1
내가 말한 것은 사실이었다. 그러나 내가 말한 것처럼 보이게하려는 것은 완전히 다른 것입니다. 특정 stdlib 인쇄의 효율성에 대해서는 아무 말도하지 않습니다. 나는 프로그램이 인쇄에 소요되는 시간이 무시할만한 충분한 작업을 수행해야한다고 말하고 있습니다. 이제 다른 사람을 트롤로 이동하십시오.
slarpspark

@slarpspark : 우리가 방정식에서 printf ()를 가져가더라도 바이트 스트림이 여전히 bash를 거쳐야하고 터미널 에뮬레이터를 거쳐야합니다. 터미널 에뮬레이터는 텍스트를 화면에 렌더링해야했습니다. 이스케이프 문자를 구문 분석 한 후 일부 자세한 명령이 수행 할 수있는 속도로 수행하면 텍스트 렌더링이 저렴하지 않습니다. 프로그램이 컨텍스트 전환을 의미하는 것처럼 모든 라인에서 출력 버퍼를 플러시하는 경우 특히 비쌉니다. 파이썬 스크립트를 작성하는 동안 종종 빡빡한 루프에서 인쇄를 제거하면 10 대 1이 발생할 수 있습니다.
Lie Ryan

SSH를 통해 실행되는 명령은 어떻습니까? CPU 대기 시간이 최소가 되더라도 네트워크 대기 시간이 확실하게 도입되면 중요합니까?
ec2011

3

자세한 코드는 일반적으로 if 명령으로 평가되며, 명령이 디스플레이 함수에 제어를 전달할 때마다 시간이 오래 걸리고 컨텍스트가 전환 될 수 있으며 더 많은 인터럽트가 발생할 수 있습니다.

그러나 자세한 코드는 때때로 완료 상태를 확인하는 별도의 스레드 인 경우 차이가 무시할 수 있습니다.

이 질문은 stackoverflow의 숙련 된 프로그래머의 기여로 많은 이점을 얻을 수 있습니다. 나는 이동 제안 :)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.