C# 秒表在紧密循环的迭代之间跳跃500µs

C# 秒表在紧密循环的迭代之间跳跃500µs,c#,C#,我编写了一些代码,它使用紧密循环来监视秒表的输出。此循环跟踪自上次迭代以来经过的刻度数。我观察到每秒有20次500微秒的跳跃,而大多数其他迭代都需要你的测试没有真正意义。。。您的进程不是在您的计算机上运行的唯一进程。系统会依次为每个线程分配处理器时间,因此有一段时间循环根本没有运行,这就解释了跳转的原因。最有可能看到的是抢占式任务切换。这是指操作系统挂起您的程序,然后执行其他程序。这就是自Windows95Win3.1和更早版本的协作多任务以来的情况,通过协作多任务,您可以任意长时间使用CPU

我编写了一些代码,它使用紧密循环来监视秒表的输出。此循环跟踪自上次迭代以来经过的刻度数。我观察到每秒有20次500微秒的跳跃,而大多数其他迭代都需要你的测试没有真正意义。。。您的进程不是在您的计算机上运行的唯一进程。系统会依次为每个线程分配处理器时间,因此有一段时间循环根本没有运行,这就解释了跳转的原因。

最有可能看到的是抢占式任务切换。这是指操作系统挂起您的程序,然后执行其他程序。这就是自Windows95Win3.1和更早版本的协作多任务以来的情况,通过协作多任务,您可以任意长时间使用CPU


顺便说一句,有一种更好的方法可以精确地计算执行时间:,它只在代码执行时计算CPU周期,因此排除此类暂停。

您是否尝试在程序中运行测试代码两次以消除JIT效应?如果将console.writeline代码替换为store to list变量,会发生什么情况,然后在循环完成后立即打印出所有计时?Win 3.1实际上为DOS应用程序执行了抢占式多任务处理,为Windows应用程序执行了协作式多任务处理。将线程优先级设置为最高不会减少/防止抢占吗?当我将其设置为最高值时,跳跃次数从每秒20次增加到每秒200次second@noahchen数字本身并不是一切;您的程序可能会从每秒20 1ms的切片增加到每秒200 4ms的切片,这显然是一个改进。
        Stopwatch sw = new Stopwatch();
        int crossThresholdCount = 0;
        long lastElapsedTicks = 0;
        long lastPrintTicks = 0;
        Console.WriteLine("IsHighResolution: " + Stopwatch.IsHighResolution);
        Console.WriteLine("Frequency: " + Stopwatch.Frequency);

        sw.Start();

        long thresholdTicks = 5000;  // 10000 ticks per ms
        while (true)
        {
            long tempElapsed = sw.ElapsedTicks;
            long sincePrev = tempElapsed - lastElapsedTicks;
            lastElapsedTicks = tempElapsed;

            if (sincePrev > thresholdTicks)
                crossThresholdCount++;

            // print output 
            if (crossThresholdCount > 0 && tempElapsed - lastPrintTicks > TimeSpan.TicksPerSecond)
            {
                lastPrintTicks = tempElapsed;
                Console.WriteLine("crossed " + crossThresholdCount + " times");
                crossThresholdCount = 0;
            }
        }