2010-02-26 9 views
9
Debug.WriteLine("Timer is high-resolution: {0}", Stopwatch.IsHighResolution); 
    Debug.WriteLine("Timer frequency: {0}", Stopwatch.Frequency); 

결과 : (! 2005)Stopwatch.Frequency가 왜 그렇게 낮습니까?

Timer is high-resolution: True 
    Timer frequency: 2597705 

This 문서 3579545의 주파수, 나보다 만 더 언급하고있다. This 블로그 게시물의 빈도는 3,325,040,000이며 미친 내용입니다.

왜 내 빈도가 그렇게 많이 낮습니까? 나는 i7 920 기계를 사용하고 있으므로 더 빠르지 않아야합니까?

+1

노트북입니까? 종종 배터리/전원 상태에 따라 기계의 클록 속도가 조정됩니다. – Nick

+0

데스크톱입니다. 전원 설정을 고성능 모드로 설정했습니다. 프로세서 클럭 속도는 기본값 (2.66GHz)입니다. –

답변

22

3,579,545는 마술 번호입니다 . 주파수를 3로 나눈 다음 원래의 IBM PC에있는 8053 타이머 칩에 입력하기 전의 주파수입니다. 이상한 숫자는 우연히 선택되지 않았습니다. 미국과 일본에서 사용되는 NTSC TV 시스템의 color burst signal 주파수입니다. IBM 엔지니어는 발진기를 구현하기 위해 저렴한 크리스탈을 찾고 있었지만 모든 TV 세트에 사용 된 것보다 저렴한 것은 없었습니다.

일단 IBM 클론이 널리 보급되면 디자이너는 동일한 빈도를 선택해야합니다. 많은 MS-DOS 소프트웨어는 그 속도로 똑딱 거리는 타이머에 의존합니다. 칩을 직접적으로 다루는 것은 일반적인 범죄였습니다.

Windows가 돌아 오면 바뀌 었습니다. Windows 2 버전은 타이머 칩을 가상화 한 첫 번째 버전이었습니다. 즉, 소프트웨어가 더 이상 타이머 칩을 직접 주소 지정하는 것이 허용되지 않았습니다. 프로세서가 보호 모드로 실행되도록 구성되었으며 I/O 명령어를 사용하려는 시도를 가로 챘습니다. 대신 커널 코드를 실행하여 명령의 반환 값을 위장 할 수 있습니다. 이제 서로의 발가락을 밟지 않고 타이머를 사용하여 여러 프로그램을 가질 수있었습니다. 하드웨어가 실제로 어떻게 구현되는지에 대한 의존성을 깨뜨리는 중요한 첫 걸음.

Win32 API (Windows NT 3.1 및 Windows 95)는 QueryPerformanceCounter() 및 QueryPerformanceFrequency() API를 사용하여 타이머에 대한 형식화 된 액세스를 제공합니다. 커널 레벨 구성 요소 인 Hardware Adaption Layer는 BIOS가 해당 빈도를 통과 할 수있게합니다. 이제 하드웨어 설계자가 정확한 주파수에 대한 의존성을 떨어 뜨릴 수있었습니다. 그때까지는 대다수의 기계가 여전히 기존의 속도를 유지하면서 오랜 시간이 걸렸습니다.

하지만 PC 디자인에서 비용을 절감하는 끝없는 모험은 끝을 맺습니다.요즘 하드웨어 디자이너는 칩셋에서 쉽게 사용할 수있는 주파수를 선택합니다. 3,325,040,000은 그러한 숫자 일 것이며, 아마도 CPU 클럭 속도 일 것입니다. 저주파와 같은 고주파는 값싼 설계, 특히 AMD 코어를 가진 설계에서 일반적입니다. 귀하의 전화 번호는 매우 드문 경우입니다. 타이머가 훨씬 정확하고 CPU 클럭은 일반적인 전자 부품 공차를 가지고 있습니다.

+0

nobugz 자세한 답변을 부탁드립니다. 마지막 단락을 확장 할 수 있습니까? 더 높은 주파수가 정밀도를 높이는 것 같습니다 : 타이머 주파수를 사용합니다. 3.3ghz의, 나는 3-nanosecond 해결책에 반면, 나의 주파수와 더불어, 나는 385ns에있다. –

+3

글쎄, 당신은 훨씬 적은 해상도를 가지고있다. 하지만 타이머가 더 정확할 것입니다. 3.3GHz CPU 클럭 속도는 일반적으로 10 % 만 정확합니다. 나는 사실을 모르지만 신호가 어떻게 생성되는지에 달려있다. 1 메가 헤르쯔 이상으로 실행되는 것들은 타이밍 소프트웨어에 충분할만큼 충분합니다. 스레딩으로 인한 지터는 그보다 훨씬 나쁩니다. –

+0

@SamPearson 아마도 초당 3,325,040,000 틱으로 두 번째 게시물의 녀석은 "Stopwatch.IsHighResolution"을 False로 설정했습니다. 그의 시스템에서 CPU "시계"를 직접 사용했기 때문에 한스에 따르면 정밀도는 ± 10 %입니다. 이것이 'IsHighResolution'의 의미라면, "초고 해"라는 용어의 선택은 불행한 것 같습니다. 초당 3,325,040,000 카운트가 초당 2,597,705 카운트보다 높은 "해상도"이기 때문입니다. 해결책은 정확성이나 불확실성이 아닌 다른 것입니다. –

6

빈도는 HAL (하드웨어 추상화 계층)에 따라 다릅니다. 펜티엄 시대에 CPU 틱 (CPU 클럭 속도를 기반으로 한 것)을 사용하는 것이 일반적 이었기 때문에 실제로는 고주파 타이머가 필요했습니다.

타이머가 어렵고 오류가 발생하기 쉬운 CPU 틱을 사용하여 멀티 프로세서 및 멀티 코어 시스템, 특히 변동 속도가 높은 CPU (CPU 클럭이 저전력 상태에서 느려집니다)에서 HAL 작성자 실시간 시계와 같이 느리지 만 안정적인 하드웨어 시계를 사용하는 것으로 보입니다.

1

Stopwatch.Frequency 값은 초당이므로 2,597,705 자의 빈도는 초당 250 만 개 이상의 틱이 있음을 의미합니다. 정확도는 얼마나 정확하게 필요합니까?

주파수의 변화는 하드웨어에 의존합니다. 가장 일반적인 하드웨어 차이점 중 일부는 코어 수, 각 코어의 빈도, CPU (또는 코어)의 현재 전원 상태, OS에서 CPU 주파수를 동적으로 조정할 수 있는지 여부 등입니다. 주파수는 항상 동일하고 검사 할 때 CPU의 상태에 따라 더 낮거나 높을 수 있지만 일반적으로 약 250 만입니다.

1

나는 2,597,705 = 귀하의 프로세서 주파수라고 생각합니다. Myne는 2,737,822입니다. i7 930

+2

거의 없습니다. 2.6 MHz는 요즘 프로세서 속도가 꽤 느릴 것입니다;) –

+0

Yeap, 당신 말이 맞아요! 그 죄송합니다. 그 사람이 뭔가 잘못 했어. 나는 스톱워치가 디버그 모드에서 잘 작동하지 않는다고 생각한다. – Pedro77

+0

:). 스톱워치 및 디버그 ... 필자가 지적하고자하는 많은 기사 ... 성능 측정은 고도로 까다 롭습니다. 그냥 재미로 : 내 주파수 : 3,320,390, I7 2600k. – Noctis

관련 문제