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)
现在,问题是如果程序在秒表启动时将控制切换到另一个其他线程,那么定时持续时间将是错误的.在上下文切换回此部分之前,另一个线程可以完成任何工作量.
请注意,我不是在询问锁定,这些都是局部变量,因此不需要这样做.我只想让定时部分连续执行.
编辑:另一个解决方案可能是减去上下文切换时间,以获得在定时部分完成工作的实际时间.不知道是否可能.
你不能那样做。否则,任何应用程序都将很容易完全控制分配给它的 CPU 时间片。
但是,您可以为您的流程设置高优先级以降低上下文切换的可能性。
这是另一个想法:
假设您不只测量一次正则表达式的执行时间,而是多次测量,您不应该将平均执行时间视为绝对值,而是将其视为与其他正则表达式的平均执行时间相比的相对值。常用表达。
有了这种想法,您可以比较不同正则表达式的平均执行时间,而无需知道上下文切换所损失的时间。假设环境在 CPU 利用率方面相对稳定,则在每个平均值中,上下文切换所损失的时间大致相同。