首页 > 解决方案 > 以毫秒变化运行循环

问题描述

这个问题之前以不同的形式被问过好几次,但我还是不太明白。

我需要找到一种方法来准确地(或非常接近地)在毫秒变化时触发 while 循环。

这个想法是第一个 while 循环将等待那段时间 - 毫秒之间的时间,一旦毫秒变化(或非常接近这种变化),开始做任何需要的事情(此时计算它的迭代量可以在 1 毫秒内完成)。

我的问题是,关于 MS 更改和循环时间,我的时间计算是否正确?

如果是这样,为什么输出不一致?或者至少输出接近的数字?(因为理论上,循环应该运行大约相同的时间,因此应该发生大约相同数量的迭代),如果是这样,它输出这些数字的原因可能是因为进程在运行时“失去了 CPU”?

如果需要,我不介意在 c 或 c++ 中执行此操作

这是我当前的代码(使用 c#):

{
    int incerments_per_ms = 0;
    const long ticks_per_ms = 10000; //10000 ticks per ms 

    var start = DateTime.Now.Ticks;//get current time in ticks since jan 1st 2000 00:00

    while ((DateTime.Now.Ticks - start) <= nano_seconds_in_ms) { }
    start += ticks_per_ms;//raise 1 ms 
    while ((DateTime.Now.Ticks - start) <= nano_seconds_in_ms)
    {
        incerments_per_ms++;
    }

    Console.WriteLine(incerments_per_ms.ToString());

    if (min == 0)
        min = incerments_per_ms;

    if (min > incerments_per_ms)
        min = incerments_per_ms;

    if (max < incerments_per_ms)
        max = incerments_per_ms;

    sum += incerments_per_ms;
}

int avg = sum / iterations;

Console.WriteLine("minimum is: " + min.ToString());
Console.WriteLine("maximum is: " + max.ToString());
Console.WriteLine("average is: " + avg.ToString() + "\n\n\n");

50 次迭代的输出:

0
6582
6601
6509
5248
6423
6710
4901
6499
6187
6426
6573
6545
6450
6567
4786
6582
6919
7018
6393
5990
6432
6084
5589
5396
6357
6578
6577
6557
7182
5137
6472
6543
6321
6533
6956
6811
2846
6269
5739
6307
5740
3673
5609
5440
5857
6561
4379
6026
6162

标签: c#datetime

解决方案


这是一个完全荒谬的解决方案,由于显而易见的原因,它不会完全准确。

前提是,只需时间一堆SpinWait(10),然后设置分辨率。显然,还有许多其他方法可以取得不同程度的成功。

当然,您可以扩展以下内容并根据口味进行调整,它能够在大多数情况下(在 C# 中)解决毫秒时间问题,并在我的电脑上漂移0.01 ms

const int cycles = 10000000;

var s = Stopwatch.StartNew();
for (int i = 0; i < cycles; i++)
   Thread.SpinWait(10);

s.Stop();

var spinRate = cycles / s.ElapsedMilliseconds;

Console.WriteLine($"Time Taken {s.ElapsedMilliseconds}ms");
Console.WriteLine($"spinRate {spinRate}");

var ticks = DateTime.Now.Ticks;

var array = new string[100];

for (var i = 0; i < 100; i++)
{
   for (var j = 0; j < (int)spinRate; j++)
      Thread.SpinWait(10);

   array[i] = $"Ticks at : {((DateTime.Now.Ticks - ticks) / (double)10000)}ms";
}

Console.WriteLine(string.Join(Environment.NewLine, array));

输出

Time Taken 3375ms
spinRate 2962
Ticks at : 1.6557ms
Ticks at : 3.5533ms
Ticks at : 4.5521ms
Ticks at : 5.5597ms
Ticks at : 6.5644ms
Ticks at : 7.5631ms
Ticks at : 8.5544ms
Ticks at : 9.554ms
Ticks at : 10.5443ms
Ticks at : 11.5346ms
Ticks at : 12.5354ms
Ticks at : 13.6026ms
Ticks at : 14.7118ms
Ticks at : 15.7672ms
Ticks at : 16.758ms
Ticks at : 17.7482ms
Ticks at : 18.813ms
Ticks at : 19.8041ms
Ticks at : 20.795ms
Ticks at : 21.7858ms
Ticks at : 22.7817ms
Ticks at : 23.7728ms
Ticks at : 24.7637ms
Ticks at : 25.7543ms
Ticks at : 26.7448ms
Ticks at : 27.7735ms
Ticks at : 28.8142ms
Ticks at : 29.8768ms
Ticks at : 30.868ms
Ticks at : 31.8593ms
Ticks at : 32.9084ms
Ticks at : 33.8998ms
Ticks at : 34.8902ms
Ticks at : 35.9574ms
Ticks at : 36.9484ms
Ticks at : 37.9449ms
Ticks at : 38.936ms
Ticks at : 39.9268ms
Ticks at : 40.9171ms
Ticks at : 41.9079ms
Ticks at : 42.9165ms
Ticks at : 43.9077ms
Ticks at : 44.898ms
Ticks at : 45.8881ms
Ticks at : 46.9491ms
Ticks at : 47.9401ms
Ticks at : 48.9311ms
Ticks at : 49.9219ms
Ticks at : 50.9127ms
Ticks at : 51.9754ms
Ticks at : 53.004ms
Ticks at : 53.9949ms
Ticks at : 54.9851ms
Ticks at : 55.9759ms
Ticks at : 56.9666ms
Ticks at : 57.9568ms
Ticks at : 58.9778ms
Ticks at : 59.9696ms
Ticks at : 60.9644ms
Ticks at : 62.0114ms
Ticks at : 63.0707ms
Ticks at : 64.0622ms
Ticks at : 65.1154ms
Ticks at : 66.1062ms
Ticks at : 67.0963ms
Ticks at : 68.111ms
Ticks at : 69.1789ms
Ticks at : 70.1699ms
Ticks at : 71.1601ms
Ticks at : 72.1502ms
Ticks at : 73.1409ms
Ticks at : 74.1311ms
Ticks at : 75.1287ms
Ticks at : 76.1199ms
Ticks at : 77.1101ms
Ticks at : 78.1003ms
Ticks at : 79.0907ms
Ticks at : 80.1556ms
Ticks at : 81.1466ms
Ticks at : 82.1373ms
Ticks at : 83.1736ms
Ticks at : 84.1645ms
Ticks at : 85.2285ms
Ticks at : 86.2196ms
Ticks at : 87.2104ms
Ticks at : 88.2008ms
Ticks at : 89.1911ms
Ticks at : 90.2238ms
Ticks at : 91.2148ms
Ticks at : 92.2055ms
Ticks at : 93.1964ms
Ticks at : 94.1871ms
Ticks at : 95.1774ms
Ticks at : 96.1681ms
Ticks at : 97.2371ms
Ticks at : 98.308ms
Ticks at : 99.2993ms
Ticks at : 100.2903ms
Ticks at : 101.2808ms
Ticks at : 102.3488ms

推荐阅读