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

C# 防止在代码的定时部分切换上下文(或者测量然后减去线程中实际未花费的时间),c#,multithreading,performance,timing,context-switch,C#,Multithreading,Performance,Timing,Context Switch,我有一个多线程应用程序,在代码的特定部分,我使用秒表来测量操作的时间: MatchCollection matches = regex.Matches(text); //lazy evaluation Int32 matchCount; //inside this bracket program should not context switch { //start timer MyStopwatch matchDuration = MyStopwatch.StartNew();

我有一个多线程应用程序,在代码的特定部分,我使用秒表来测量操作的时间:

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());
}
现在的问题是,如果程序在秒表启动时将控制切换到其他线程,那么计时的持续时间将是错误的。在上下文切换回本节之前,另一个线程可以完成任意数量的工作

请注意,我不是在问锁定,这些都是局部变量,所以没有必要这样做。我只希望定时部分连续执行


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

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

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


还有一个想法:
假设不只是一次而是多次测量正则表达式的执行时间,则不应将平均执行时间视为绝对值,而应视为与其他正则表达式的平均执行时间相比的相对值。

通过这种思想,您可以比较不同正则表达式的平均执行时间,而不必知道上下文切换所损失的时间。假设环境在CPU利用率方面相对稳定,那么在每个平均情况下,上下文切换所损失的时间大致相同。

我认为您无法做到这一点

对我来说,“最大的努力”是将您的方法放在一个单独的线程中,并使用

Thread.CurrentThread.Priority = ThreadPriority.Highest; 
尽可能避免上下文切换

如果我可能会问,为什么你需要如此精确的测量,为什么你不能提取函数,并在它自己的程序中进行基准测试呢

编辑:根据用例的不同,它可能会很有用

Process.GetCurrentProcess().ProcessorAffinity = new IntPtr(2); // Or whatever core you want to stick to

避免在内核之间切换

谢谢。请参见编辑。是否可以测量并减去上下文切换时间,以获得在计时部分完成工作的实际时间?@DavidS:我不知道有什么方法可以实现这一点。但请参阅更新了解另一个想法。您的更新是一个极好的建议!我非常喜欢它。绝大多数正则表达式都是快速的,因此,通过一些健全性检查,与平均时间的相对值甚至比我设法解决原始问题时更有用。@DavidS:“很高兴它有帮助:”)关于你的问题,这需要非常大的体系结构更改。我不需要一次性的bechmark,因为文本和正则表达式每次都不同。这是可能的。我更喜欢另一种解决方案。我需要精确的测量来检测,以便我可以优化或删除正则表达式,因为缓慢的正则表达式会延迟程序并以这样一种方式累积,最终会产生非常可观的业务成本。我一定会试试threadpriority。然后你可能会使用一个探查器,它可以让你看到你在每个函数上花费了多少时间:)一个免费的(没有那么多功能)是很简单的。谢谢,我使用探查器,但我不能将它用作这个问题的一个始终在线的测量工具。