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

标签 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();
    //actually evaluate regex
    matchCount = matches.Count;
    //adds the time regex took to a list
    durations.AddDuration(matchDuration.Stop());
}

现在的问题是,如果程序在秒表启动时将控制权切换到其他地方的另一个线程,那么计时持续时间将是错误的。在上下文切换回此部分之前,另一个线程可能已经完成了任意数量的工作。

请注意,我不是在询问锁定,这些都是局部变量,因此没有必要。我只想让定时部分连续执行。

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

最佳答案

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

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


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

关于c# - 防止代码定时部分的上下文切换(或测量然后减去实际未在线程中花费的时间),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16917092/

相关文章:

c# - 在 cref 中使用时 "T:"是什么

c# - 检测音频文件中的小峰值

c# - 一个方法链能叫LINQ吗?

c - 有效地从 6 个源文件填充两个 d 数组

c# - Mono:是否支持更改线程的优先级?

objective-c - 在多线程应用程序的 AFNetworking 中测量响应时间

c++ - 什么会导致可连接线程在调用 join 时失败

java - ForkJoinPool中递归任务和递归 Action 的区别

multithreading - Fortran 基本函数与基本子例程

javascript - 在 jQuery : javascript template vs. 中高效克隆 html 追加 html,哪个性能更好?