2009-07-19 3 views
8

나는 기능의 성능을 측정하는 좋은 question 발견하고 답변 멀티 프로세서 시스템의 스톱워치에 대한 모범 사례?

Stopwatch sw = new Stopwatch(); 
sw.Start(); 
//DoWork 
sw.Stop(); 
//take sw.Elapsed 

다음하지만 멀티 프로세서 시스템에서 실행하는 경우이 유효로 스톱워치를 사용하는 것이 좋습니다? 스레드를 다른 프로세서로 전환 할 수 있습니까? 같은 일도 Enviroment.TickCount에 있어야합니다. 답은 다음과 같이 I가 BeginThreadAffinity 내부 내 코드를 래핑한다 예이면

Thread.BeginThreadAffinity(); 
Stopwatch sw = new Stopwatch(); 
sw.Start(); 
//DoWork 
sw.Stop(); 
//take sw.Elapsed 
Thread.EndThreadAffinity(); 

PS

함수 다른 실행되면 스위칭 스레드 레벨 위에 예를 들어 상기 프로세서 레벨뿐만 아니라 발생 스레드가 시스템을 다른 프로세서로 전환 할 수 있도록하려면 스톱워치가이 전환 후에 유효할까요? 함수 자체가 멀티 스레드되지 않은 경우

난 단지뿐만 아니라에 Thread.sleep를 사용하여 타이머 기능을 시뮬레이션 할 수 perfromance 측정을 위해 스톱워치를 사용하고 있지 않다

답변

5

(중복 호출을 방지하기 위해) (예를 들어, 그것은 다른 스레드를 생성하지 않습니다/프로세스와 그들이 완료 될 때까지 기다려야합니다) 유일한 문제는 당신의 기계입니다.

컴퓨터가 다른 작업을 수행하는 중일 경우 테스트를 무효화 할 수 있습니다 (예 : CPU 바인딩 테스트를 수행하면서 H.264 비디오 인코딩). 마찬가지로 메모리 바인딩 된 모든 것을 테스트 할 때 모든 실제 메모리를 사용하면 결과가 무효화 될 수 있습니다.

따라서 일반적으로 이러한 테스트를 수행 할 때는 기계가 최소 하중에서 보통 하중을 받아야합니다. 그 외에는 다중 처리 문제가 없습니다. 예, 프로그램 실행 중에 코어를 스왑 할 수 있지만 수행하는 오버 헤드는 측정 된 시간의 아주 작은 비율이거나 측정 된 시간이 너무 짧아 시스템의 시간 측정 단위가 문제가됩니다.

+0

함수가 백그라운드 스레드에서 실행중인 경우 함수 스레드가 측정에서 오류로 연결되는 다른 프로세서로 전환 할 수 있음을 의미합니다. –

+0

MSDN에 따르면 "백그라운드 스레드는 전경 스레드와 동일하지만 백그라운드 스레드는 그렇지 않습니다 프로세스가 종료되는 것을 방지합니다. " Ref : http : // msdn.microsoft.com/en-us/library/system.threading.thread.isbackground.aspx –

+0

@Tormod Fjeldskår, 전경/배경 스레드를 다른 프로세서로 전환 할 수 있으므로 해당 형식에 신경 쓰지 않지만 내 의견에 언급했습니다. 예를 들면 더 이상 –

2

나는 스톱워치의 저수준 구현과 실행 중간에 프로세서를 바꾸면 동작을 무효화 할 수 있는지 묻고 있다고 생각한다. 구현은 내부적으로 QueryPerformanceCounter에 사용하지합니다 (MS BCL 참조 소스를보고, 나는 적어도 .NET 4.0을에서 확인했습니다.)

이 API 상태에 대한 MS documentation :

를 다중 프로세서 컴퓨터에서 그것을 어떤 프로세서가 이라고 불리는 지 문제가되지 않습니다. 그러나 기본 입/출력 시스템 (BIOS) 또는 하드웨어 추상화 계층 (HAL)의 버그로 인해 서로 다른 프로세서 에서 다른 결과를 얻을 수 있습니다.

따라서 올바른 것입니다. 원칙적으로 중요하지 않지만이 의견은 구현이 의도 된 인터페이스와 일치하지 않는 경우가 관찰 된 것을 시사합니다. 측정의 정확성을 보장하려면 명시한대로 스레드 유사성을 사용할 수 있습니다. 즉, 큰 차이는 꽤 심각한 BIOS 또는 HAL 버그가 될 것이므로 관찰 된 오류는 매우 작다고 추측합니다.

관련 문제