2017-09-22 17 views
0

저는 알고리즘 및 성능 벤치 마킹에 비교적 익숙하지만 몇 가지 질문이 있습니다.알고리즘의 성능 변동

필자는 이미 까다로운 프로세스 루프의 중단을 최소화하기 위해 한 번에 작은 반복으로 처리 할 수있는 알고리즘을 작성했습니다. 나의 목표는 각 반복마다 1ms 미만의 시간 동안 처리하는 것이었고, 따라서 상당히 일관된 성능을 갖는 것이 상당히 중요해 보였습니다.

불행히도 알고리즘을 0.5ms로 평균화하기 위해 프로세스 가중치를 적용한 후에는 20ms 이상 걸리는 경우가있었습니다. 나는 데이터 수집이 몇몇 문제를 일으킨다는 것을 알아 냈다. (나는 그것이 메모리에서 움직이고 있다고 가정한다.) 나는 그 이후로 해결했지만 여전히 성능 변동을 보인다.

그래서 여기에 빈 방법을 작성했습니다. 심지어 여기 나는이 가끔 높은 시간을 얻는다.

public void DoTask() 
    { 
     for (int i = 0; i < 100000; i++) 
     { 
      //do nothing 
     } 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     DoTask(); //burn 

     var watch = new Stopwatch(); 
     watch.Start(); 

     double time; 
     for (int j = 0; j < 20; j++) 
     { 
      for (int i = 0; i < 1000; i++) 
      {     
       time = watch.ElapsedTicks; 

       DoTask(); 

       time = watch.ElapsedTicks - time; 

       LongestTime = Math.Max(LongestTime, time); 

       TotalTime += time; 

       Count++; 
      } 
      double avgTime = TotalTime/Count; 

      MessageBox.Show($"Longest time: {ToMs(LongestTime).ToString("#.##")} Avg time: {ToMs(avgTime).ToString("#.##")}"); 
      TotalTime = 0; 
      Count = 0; 
      LongestTime = 0; 
     } 
    } 

가장 긴 시간 : 13.04 평균 시간 : 0.01이 발생하는 원인은 무엇

? 그것은 내가 통제 할 수없는 것입니까?

감사합니다.

+0

.NET 응용 프로그램에서 결정적 실행 시간을 보장 할 수 없습니다. 당신이 통제 할 수없는 가비지 컬렉터가 있습니다. .NET은 "하드 실시간"응용 프로그램에 적합하지 않습니다. – dymanoid

+0

DoTask()는 게시물에 있음 - 아무것도 수행하지 않습니다. –

+0

또한 멀티 태스킹 OS에서 작업하고 있다는 것을 잊지 마십시오. 따라서 다른 프로그램이 CPU 시간을 얻는 동안 계산의 일부가 보류 될 가능성이 큽니다. – fvu

답변

1

실제로는 Windows 문제 (또는 멀티 태스킹을 지원하지만 모든 소비자 OS를 다루는 실시간 OS가 아닌 운영 체제)가 더 많습니다. 모든 일반적인 멀티 태스킹 운영 체제는 주어진 스레드가 중단없이 실행될 수 있고 잠재적으로 다른 스레드로 전환하는 각 스레드 기간을 제공합니다. 만약 당신의 스텝의 실행이 중간에 중단되어 다른 스레드 시간이 Stopwatch으로 측정된다면, 스레드는 실행을 계속하기 위해 기다리고있는 시간이 될 것입니다 (기본적으로 ~ 15ms의 Windows에서).

정확한 측정 시간은 일반적으로 전문적인 도구 인 프로파일 러에 맡기는 것이 어렵습니다.

을 조금만 처리하려는 경우 코드를 실행하는 스레드 우선 순위를 높이십시오. 그렇게하면 쓰레드가 다른 쓰레드보다 우선적으로 사용 중지 될 가능성이 낮아집니다.

주 :

  • 실시간 운영 시스템은 일반적으로 비 중단 실행 시간을 보장하기 위해 코드를 실행하는 일부 협력을 필요로한다. 또한 나는 C#을 지원하는 OS가 있다고 믿지 않는다.
  • MS DOS와 같은 비 멀티 태스킹 OS에서도 OS와 마찬가지로 장치 (디스크, 키보드, 타이머)의 인터럽트를 처리해야하는 방식으로 측정 한 것과 비슷한 임의의 변동을 볼 수 있으며 결과적으로 기본 단일 스레드 코드 실행을 일시 중단 할 수 있습니다 인터럽트 처리 코드의 지속 기간 동안 (보통 작은 시간이지만 문제는 여전히 존재 함).
  • .Net 코드는 임의의 시점 (즉, 다른 스레드의 할당으로 인해)에서 발생할 수있는 가비지 수집을 수행해야하기 때문에 몇 가지 추가적인 우려 사항을 추가합니다. 더 많은 정보 Fundamentals of Garbage Collection.
+0

정말 유익한 정보입니다. 감사. –