2013-05-09 2 views
2

그래픽 프로그램이 있고 특정 함수 호출에 걸리는 시간을 측정하고 싶습니다. 후드에서 std::cout이 어떻게 작동하는지 잘 모르므로 타이머 호출 사이의 호출이 성능에 영향을 줄 수 있는지 묻고 싶습니다. 자체적으로 속도가 느려서 자연스럽게 측정 할 함수에 넣지는 않지만 버퍼링/비동기식이므로 어떤 식 으로든을 호출 한 후에도 효과가 남아있게됩니다. ? 나는 이와 같은 것을하려고한다. (의사 코드)std :: cout이 타이머에 영향을 줍니까?

timer->Start(); 
RunSomeFunction(); 
timer->Stop(); 
std::cout << timer << std::endl; // Could this affect the next timer event? 
timer->Start(); 
RunAnotherFunction(); 
timer->Stop(); 
std::cout << timer << std::endl; 
// etc 
+0

한 스레드에서'std :: cout'으로 출력하는 것이 비동기 적이 지 않습니다. 'timer-> Start()'는 쓰기가 끝날 때까지 시작되지 않습니다. – Yuushi

답변

3

간단히 말해서, 아니오.

길게 대답 : 그러나, 그것은 cout이가는 곳과 실제로 실행중인 시스템에 따라 다릅니다.

일반적으로 cout의 내부는 파일이 "표준 출력"파일 핸들 인 일종의 "파일 쓰기"시스템 호출을 사용합니다. 출력 장치가 일종의 디스플레이 장치, 창 또는 파일 일 수 있습니다 리디렉션됩니다. 물론 이것은 일종의 인터럽트 또는 다른 곳에서 실행중인 일부 프로세스 (예 : Windows의 경우 "cmd.exe"또는 Linux/Unix의 경우 "xterm"또는 유사)로 이어질 수 있습니다. 기능이 매우 짧은 경우, 이러한 종류의 "간섭"으로 결과를 변경할 수 있습니다. 물론 웹 브라우저가 깨어나서 새 항목이나 이메일 소프트웨어가 있는지 확인하기 위해 깨어날 수도 있습니다. 다른 시스템의 네트워크 만 비슷한 효과를냅니다. 그러나 멀티 코어 프로세서를 갖춘 현대 시스템에서 (시스템이 이미 100 % CPU 사용을 실행하지 않는 한) 이러한 효과는 상당히 작아야하며 실제로 많은 것을 설명하지 않아야합니다. cout 또는 다른 잠재적 요인들

편집 : 또한 매우 민감한 코드 인 경우 cout (또는 몇 줄 이상인 다른 함수 (또는 줄이 적은 경우에도 큰 덩어리를 읽는 루프가 발생합니다)을 호출하면 영향을받습니다. 캐시 내용에 영향을 줄 수 있습니다.

+1

+1 특히 캐쉬에 영향을주는'cout'에 대한 메모와 같이 훌륭한 답변입니다. –

2

기술적으로 std::cout (대부분의 기능과 마찬가지로) 일부 RAM 페이지가 스왑되거나 OS의 버퍼를 채우거나 다른 방법으로 OS에 대한 추가로드를 생성 할 수 있습니다. 그러나 눈에 띄지 않아야합니다.

프로세스 나 OS 커널 내부의 추가 (비동기) 작업은 다른 스레드에서 수행되므로 프로그램에 많은 영향을 미치지 않습니다 (멀티 코어 CPU를 사용하고 시스템이 게으른).

관련 문제