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