저는 알고리즘 및 성능 벤치 마킹에 비교적 익숙하지만 몇 가지 질문이 있습니다.알고리즘의 성능 변동
필자는 이미 까다로운 프로세스 루프의 중단을 최소화하기 위해 한 번에 작은 반복으로 처리 할 수있는 알고리즘을 작성했습니다. 나의 목표는 각 반복마다 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이 발생하는 원인은 무엇
? 그것은 내가 통제 할 수없는 것입니까?
감사합니다.
.NET 응용 프로그램에서 결정적 실행 시간을 보장 할 수 없습니다. 당신이 통제 할 수없는 가비지 컬렉터가 있습니다. .NET은 "하드 실시간"응용 프로그램에 적합하지 않습니다. – dymanoid
DoTask()는 게시물에 있음 - 아무것도 수행하지 않습니다. –
또한 멀티 태스킹 OS에서 작업하고 있다는 것을 잊지 마십시오. 따라서 다른 프로그램이 CPU 시간을 얻는 동안 계산의 일부가 보류 될 가능성이 큽니다. – fvu