Beispiel 1 schläft mehr als 1 ms pro Iteration. Stattdessen dauert es ungefähr 15 Millisekunden pro Iteration, was meiner Meinung nach an der Windows-Taktauflösung liegt.
Beispiel 2 ist genau, aber die CPU-Auslastung ist relativ hoch. Dies scheint eine Auslastungsschleife zu sein, die ich mit Thread.Sleep(0) oder Thread.Yield() zu beheben versucht habe, aber die CPU-Auslastung ist nicht viel geringer.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?
< pre class="lang-cs Prettyprint-Override">
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;
}
}
}
- (ungenau)
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;
- mit Thread.Yield() oder Thread.Sleep(0) (genau, aber relativ hohe CPU-Auslastung)
Code: Select all
Stopwatch