防止代码的定时部分中的上下文切换(或者测量然后减去实际上没有花费在线程中的时间)

Dav*_* S. 6 c# performance multithreading timing context-switch

我有一个多线程应用程序,在某段代码中我用a Stopwatch来衡量一个操作的时间:

MatchCollection matches = regex.Matches(text); //lazy evaluation
Int32 matchCount;
//inside this bracket program should not context switch
{
    //start timer
    MyStopwatch matchDuration = MyStopwatch.StartNew();
    //actually evaluate regex
    matchCount = matches.Count;
    //adds the time regex took to a list
    durations.AddDuration(matchDuration.Stop());
}
Run Code Online (Sandbox Code Playgroud)

现在,问题是如果程序在秒表启动时将控制切换到另一个其他线程,那么定时持续时间将是错误的.在上下文切换回此部分之前,另一个线程可以完成任何工作量.

请注意,我不是在询问锁定,这些都是局部变量,因此不需要这样做.我只想让定时部分连续执行.

编辑:另一个解决方案可能是减去上下文切换时间,以获得在定时部分完成工作的实际时间.不知道是否可能.

Dan*_*rth 5

你不能那样做。否则,任何应用程序都将很容易完全控制分配给它的 CPU 时间片。

但是,您可以为您的流程设置高优先级以降低上下文切换的可能性。


这是另一个想法:
假设您不只测量一次正则表达式的执行时间,而是多次测量,您不应该将平均执行时间视为绝对值,而是将其视为与其他正则表达式的平均执行时间相比的相对值。常用表达。
有了这种想法,您可以比较不同正则表达式的平均执行时间,而无需知道上下文切换所损失的时间。假设环境在 CPU 利用率方面相对稳定,则在每个平均值中,上下文切换所损失的时间大致相同。