Hochfrequenz-Abfrageschleife in C#?C#

Ein Treffpunkt für C#-Programmierer
Guest
 Hochfrequenz-Abfrageschleife in C#?

Post by Guest »

Ich versuche, eine Hochfrequenz-Abfrageschleife in C# zu erstellen, habe aber Probleme mit der Genauigkeit und der CPU-Auslastung.
Beispiel 1: Die Schleife schläft etwa 15,6 ms lang , anstelle der angegebenen 1 ms pro Iteration. Ich habe herausgefunden, dass dies aufgrund der Windows-Taktauflösung beabsichtigt ist.
Beispiel 2: Die Schleife ist genau, hat aber eine relativ hohe CPU-Auslastung. Dies scheint eine Auslastungsschleife zu sein, die ich mit Thread.Sleep(0) oder Thread.Yield() zu beheben versucht habe, aber die CPU-Auslastung bleibt relativ hoch.
Gibt es eine Möglichkeit, eine Schleife mit einer hohen Abfragerate zu erstellen, die genau ist (d. h. nicht von der 15-ms-Ungenauigkeit beeinträchtigt wird) und keine CPU-Ressourcen beansprucht?

Code: Select all

// Assume my loop is supposed to be 1000hz (1ms per iteration)

void Example1()
{
int i = 0;

// Sleeps for 15ms instead of 1ms.
while(true)
{
i++;
Thread.Sleep(1);
}
}

void Example2()
{
Stopwatch stopwatch = Stopwatch.StartNew();
long prevElapsed = 0;

int i = 0;

while (true)
{
// Accurate to 1ms but relative high CPU usage
// for just incrementing a counter 1000 times per sec.
if (stopwatch.ElapsedMilliseconds - prevElapsed >= 1)
{
i++;
prevElapsed = stopwatch.ElapsedMilliseconds;
}
}
}
Ich habe verschiedene Methoden ausprobiert, aber keine war sowohl genau (nahe 1 ms pro Iteration) als auch CPU-effizient:

[*]

Code: Select all

Thread.Sleep(1);
(ungenau)
[*]

Code: Select all

await Task.Delay(1);
(ungenau)
[*]

Code: Select all

System.Timers.Timer;
(ungenau)
[*]

Code: Select all

System.Threading.Timer;
(ungenau)
[*]

Code: Select all

Stopwatch
mit Thread.Yield(), Thread.Sleep(0) oder SpinAwait (genau, aber immer noch eine relativ hohe CPU-Auslastung)
< /ul>
Gibt es eine Möglichkeit, eine hohe Abfragerate zu erreichen, bei der jede Iteration näher an einer Millisekunde liegt, ohne die CPU zu belasten oder sich auf Methoden zu verlassen, die von der Taktauflösung des Betriebssystems beeinflusst werden?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post
  • Hochfrequenz-Abfrageschleife in C#?
    by Guest » » in C#
    0 Replies
    11 Views
    Last post by Guest