2016-06-25 4 views
2

나는 하위와 버튼이 있습니다. 그리고 코드는 다음과 같다 : 나는 서브가 "button1을"출력 프로그램을 클릭하는 것입니다 실행할 때틱이 모순되어 변동됩니다

Private Sub plus(ByRef a As Integer) 
    For i = 0 To a 
     a = a + a 
    Next 
End Sub 

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
    Dim i As Integer = 19 
    Dim sw As New Stopwatch 
    sw.Start() 
    plus(i) 
    sw.Stop() 
    MsgBox(sw.ElapsedTicks) 
End Sub 

310 개 그게 내가 클릭하여 다시 서브를 실행하면 310

sw.elapsedticks 의미 "button1"다시 출력 할 프로그램 1 < <1 ellapsedticks 만

어떻게 그렇게 할 수 있습니까?

나는 내 vb.net 프로그램을 멈추려 고 노력했다. 다시 실행하고 그 버튼을 다시 클릭하면, 다시 스톱워치를 클릭 한 후 272 초 스톱워치 elapsedticks만큼 가치가있다. elapsedticks가 다시 1이된다.

왜 그런지 설명해주십시오.

+0

이유는 'quicksort' 메소드의 코드와 관련이 있다고 가정합니다. – Blackwood

+0

정말요? 나는 새로운 프로젝트 vb.net에서 다시 테스트했고 나는 매우 간단한 서브를 만든다. 같은 문제가 발생했습니다 !! 제가 서브를 확실하게 부를 때, 서브는 매우 간단하기 때문에 200 틱이 걸립니다. 그리고 내가 다시 그 잠수함을 부를 때, 단지 3 ticks 만 걸립니다. –

+0

그런 다음 질문을 편집하여 매우 간단한 하위 항목을 포함하십시오. 그대로, 귀하의 질문에 답하기 위해 필요한 [Minimal, Complete, Verifiable Example] (http://stackoverflow.com/help/mcve)이 부족합니다. – Blackwood

답변

0

StopWatch 클래스는 DateTime 클래스를 사용하여 대체되며 하드웨어가 고성능 카운터를 지원하지 않는 경우 측정에 틱을 사용합니다. 현재 대부분의 컴퓨터는 Windows 2000 이상에서 고성능 카운터를 가지고 있습니다. 이를 염두에두고 .NET Stopwatch 클래스는이 고주파수 타이머를 기반으로합니다. 일반적으로 Start을 호출하면 성능 카운터를 쿼리하고 값을 저장합니다. Stop 때 성능 카운터를 다시 쿼리합니다. 그러면 경과 시간은이 두 값을 간단히 뺀 값이되어 ElapsedTicks이됩니다. 여기

이 속성은 단지 GetRawElapsedTicks()에 대한 호출이

public long ElapsedTicks { 
     get { return GetRawElapsedTicks(); } 
    } 

아래의 기능이를 반환하게 ... 추가 설명을 위해 한 번 봐 가지고 몇 가지 항목입니다 스톱 워치가 시작된 때부터 스톱워치 Stop 메서드가 호출 될 때까지 경과 한 실제 시간. 위에서 언급 한 바와 같이 the elapsed time is a simple subtraction of those two values은 아래 내용을 볼 수 있습니다 : currentTimeStamp - startTimeStamp.

// Get the elapsed ticks.   
#if FEATURE_NETCORE 
     public long GetRawElapsedTicks() { 
#else 
     private long GetRawElapsedTicks() { 
#endif 
      long timeElapsed = elapsed; 

      if(isRunning) { 
       // If the StopWatch is running, add elapsed time since 
       // the Stopwatch is started last time. 
       long currentTimeStamp = GetTimestamp();     
       long elapsedUntilNow = currentTimeStamp - startTimeStamp; 
       timeElapsed += elapsedUntilNow; 
      } 
      return timeElapsed; 
     } 

이상은 #if FEATURE_NETCORE입니다. 이상이 무엇인지 궁금 할 것입니다. 이를 전 처리기 명령이라고합니다. 기본적으로 그들은 if-else 문처럼 작동합니다. 조건이 충족되지 않으면 컴파일시에 미리 컴파일 결정이되고 런타임이 아니므로 코드가 컴파일시에 포함되지 않습니다.

이 모든 내용이 위에 언급되었습니다 Hans Passant는 JIT (Just in in-time) 컴파일에 관해 이미 알고 있습니다. 위에서 언급 한 모든 내용은 설명을 위해이를 더 자세히 설명합니다. 차이점의 실제 이유는 처음으로을 컴파일하고 실행하는 데 걸리는 시간입니다.

언급 할 또 다른 사항. stopwatch 클래스는 long 변수 유형을 사용하여 frequency이라고하는 것을 저장합니다. 주파수 "는 고해상도 성능 카운터의 주파수를 저장하고, 그렇지 않으면 TicksPerSecond를 저장합니다.시스템이 실행되는 동안 빈도를 변경할 수 없으므로 한 번만 초기화됩니다.

다음은 주파수와 관련하여 많은 계산 방법을 가지고있는 constants입니다. 당신이 StopWatch 클래스의 새 인스턴스를 만들 때

private const long TicksPerMillisecond = 10000; 
private const long TicksPerSecond = TicksPerMillisecond * 1000; 

이 실행되는 것입니다. 당신이 지금 볼 수

bool succeeded = SafeNativeMethods.QueryPerformanceFrequency(out Frequency);    
      if(!succeeded) { 
       IsHighResolution = false; 
       Frequency = TicksPerSecond; 
       tickFrequency = 1; 
      } 
      else { 
       IsHighResolution = true; 
       tickFrequency = TicksPerSecond; 
       tickFrequency /= Frequency; 
      } 

주파수, 경과 시간 계산 될 것입니다 얼마나 자주 tick이 발생할 것입니다 방법 을 설정에 큰 역할을한다. 응용 프로그램을 중지하더라도 현재 주파수가 저장되어 있어도 상관 없습니다. 유일한 방법은 주파수를으로 재설정하면 컴퓨터를 재부팅하는 것입니다.

+1

주파수와 관련하여이 모든 것이 질문과 관련이있는 것은 무엇입니까? 그는 스톱워치 수업이 어떻게 작동하는지 묻지 않고, 방법을 연속적으로 호출 할 때 왜 시간의 차이를 보는지 묻습니다. 이 질문에 실제로 대답하는 유일한 단락은 한스의 의견을 참고하는 부분입니다. –

+0

@CodyGray 질문과 관련하여 많은 부분이 있습니다. 방법이 처음 실행되는 것은 아닙니다. 처음 실행 된 빈도를 사용합니다. 나는 나의 지위에서 그것을 설명했다. 마지막 부분을 읽으면 나는 이것을 설명한다. 그 클래스를 처음으로 인스턴스화하면 주파수가 저장됩니다. 같은 일을 실행 한 후에는 시간이 크게 줄어 듭니다. 메소드가 한번 클릭되면 *** 문제가되지 않습니다. 응용 프로그램을 중지하고 다시 실행할 수 있으며 결과는 여전히 낮습니다! 왜 그것이 저장되어있는 주파수를 보았 기 때문입니다! – Codexer

+0

아, 네가 무슨 말하는지 알 겠어. Stopwatch 클래스 인스턴스의 첫 번째 생성시 정적 생성자가 실행되어야하는데 시간이 오래 걸립니다.컴파일러가이를 잘 최적화하지 않기 때문에 정적 Ctors는 C#에서 매우 느립니다. 그러나이 초기화는 Start 함수가 호출 될 때까지 시작 시간이 기록되지 않기 때문에 타이밍 측정에 영향을 미치지 않습니다. 그의 코드는 단순히'Start'와'Stop' 사이의 경과 시간을 측정합니다 (실제로'plus' 함수를 호출하는 데 걸리는 시간입니다). –